2012-02-08 37 views
2

我正在使用JXTreeTable顯示一些數據,並且我想使用SwingX提供的機制來更改某些列的渲染器。JXTreeTable:如何使用ComponentProvider爲一列設置渲染器

我以前使用JXTable和TableCellRenderer的自定義實現,但這不再工作(我看到字符串,我應該有進度條,按鈕,...)。

因此,我試圖這樣做,以達到我想要的:

examsTable.getColumn(6).setCellRenderer(new DefaultTableRenderer(new ButtonProvider())); 

但ComponentProvider的createRenderer的覆蓋方法被調用一次(甚至當我有一個以上的線,我JXTreeTable)和無按鈕顯示(該方法只包含return new JButton();)。

謝謝!

編輯>希望你會回答kleopatra,因此很高興你做到了。

我盡了我最大的努力,但不知何故桌子不顯示。我想我忘了一些東西(我是一個新的Java的C++開發者),但我想這不是一個嚴重的問題,它可能與我的主要問題無關。

import java.awt.Dimension; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

import org.jdesktop.swingx.JXTreeTable; 
import org.jdesktop.swingx.decorator.HighlighterFactory; 
import org.jdesktop.swingx.renderer.CellContext; 
import org.jdesktop.swingx.renderer.ComponentProvider; 
import org.jdesktop.swingx.renderer.DefaultTableRenderer; 
import org.jdesktop.swingx.treetable.AbstractTreeTableModel; 

public class Test extends JFrame { 
    JXTreeTable table = new JXTreeTable(); 
    JPanel panel = new JPanel(); 

    public Test() { 
     setMinimumSize(new Dimension(400, 400)); 

     table.setEditable(false); 
     table.setDragEnabled(false); 
     table.setColumnSelectionAllowed(false); 
     table.setHighlighters(HighlighterFactory.createAlternateStriping()); 
     table.setRowHeight(20); 
     table.setMinimumSize(new Dimension(200, 200)); 

     class Series { 
      public String seriesInstanceUID; 
      public String patientName; 
      public String patientBirthDate; 
      public String securityToken; 

      public Series(String seriesInstanceUID, String patientName, String patientBirthDate, String securityToken) { 
       this.seriesInstanceUID = seriesInstanceUID; 
       this.patientName = patientName; 
       this.patientBirthDate = patientBirthDate; 
       this.securityToken = securityToken; 
      } 
     } 

     class Study { 
      public List<Series> series = new ArrayList<Series>(); 
     } 

     class Root { 
      public List<Study> studies = new ArrayList<Study>(); 
     } 

     AbstractTreeTableModel model = new AbstractTreeTableModel() { 
      Root root = new Root() { 
       { 
        studies.add(new Study() { 
         { 
          series.add(new Series("Series 1.1", "Mr. X", "1988-10-23", "sec-xx-1")); 
          series.add(new Series("Series 1.2", "Mr. X", "1988-10-23", "sec-xx-2")); 
          series.add(new Series("Series 1.3", "Mr. X", "1988-10-23", "sec-xx-3")); 
         } 
        }); 
        studies.add(new Study() { 
         { 
          series.add(new Series("Series 2.1", "Mrs. Y", "1960-02-11", "sec-yy-1")); 
         } 
        }); 
        studies.add(new Study() { 
         { 
          series.add(new Series("Series 3.1", "HAL 9000", "1975-04-21", "sec-zz-1")); 
          series.add(new Series("Series 3.2", "HAL 9000", "1975-04-21", "sec-zz-2")); 
         } 
        }); 
       } 
      }; 

      @Override 
      public String getColumnName(int columnIndex) { 

       switch (columnIndex) { 
       case 0: 
        return "Series Instance UID"; 

       case 1: 
        return "Patient Name"; 

       case 2: 
        return "Patient Birth Date"; 

       case 3: 
        return "View online"; 

       default: 
        return ""; 
       } 
      } 

      @Override 
      public int getIndexOfChild(Object parent, Object child) { 
       if (parent == root) { 
        return root.studies.indexOf(child); 
       } 

       if (parent instanceof Study) { 
        Study study = (Study) parent; 

        return study.series.indexOf(child); 
       } 

       return -1; 
      } 

      @Override 
      public int getChildCount(Object parent) { 
       if (parent == root) { 
        return root.studies.size(); 
       } 

       if (parent instanceof Study) { 
        Study study = (Study) parent; 

        return study.series.size(); 
       } 

       return 0; 
      } 

      @Override 
      public Object getChild(Object parent, int index) { 
       if (parent == root) { 
        return root.studies.get(index); 
       } 

       if (parent instanceof Study) { 
        Study study = (Study) parent; 

        return study.series.get(index); 
       } 

       return null; 
      } 

      @Override 
      public Object getValueAt(Object node, int columnIndex) { 
       if (!(node instanceof Series) && !(node instanceof Study)) 
        return null; 

       if (columnIndex < 0 || columnIndex >= getColumnCount()) 
        return null; 

       if (root == null) 
        return null; 

       if (node instanceof Series) { 
        Series series = (Series) node; 

        if (columnIndex == 0) 
         return series.seriesInstanceUID; 
        else if (columnIndex == 1) 
         return series.patientName; 
        else if (columnIndex == 2) 
         return series.patientBirthDate; 
        else if (columnIndex == 3) 
         return series.securityToken; 
       } else if (node instanceof Study) { 
        // Empty for now 
       } 

       return null; 
      } 

      @Override 
      public int getColumnCount() { 
       return 4; 
      } 

      @Override 
      public Object getRoot() { 
       return root; 
      } 

      public void update() { 
       modelSupport.fireNewRoot(); 
      } 
     }; 

     table.setTreeTableModel(model); 

     table.getColumnModel().getColumn(3).setCellRenderer(new DefaultTableRenderer(new ComponentProvider<JButton>() { 
      { 
       rendererComponent.setHorizontalAlignment(JButton.CENTER); 
      } 

      @Override 
      protected void format(CellContext context) { 
       rendererComponent.setText(getValueAsString(context)); 
      } 

      @Override 
      protected void configureState(CellContext context) { 
       rendererComponent.setHorizontalAlignment(getHorizontalAlignment()); 
      } 

      @Override 
      protected JButton createRendererComponent() { 
       return new JButton("View online"); 
      } 
     })); 

     panel.add(table); 
     this.setContentPane(panel); 
    } 

    public static void main(String[] args) { 
     (new Test()).setVisible(true); 
    } 
} 

編輯>我其實已經注意到,它的作品。但不是我想要的。我想看到一個真正的按鈕(現在看起來與其餘部分有點不同),知道它的路徑(父對象和列索引),並在點擊或懸停時看到效果(按鈕應該按下,...)。

我該如何做到這一點?

+0

應該像J/X/Table一樣工作,與JXTreeTable中的呈現沒有什麼特別的關係(除了層次列)。請顯示sscce,以便我們可以在您的代碼中找到該錯誤:-) – kleopatra 2012-02-08 10:01:14

+0

問題已更新。該表不出於某種原因。我一直試圖解決它大約半小時,仍然不知道爲什麼它沒有顯示......但是,這應該,希望,不會成爲你的問題。謝謝! – ixM 2012-02-08 11:05:34

+0

你的模型出了問題(即使是在普通樹中也沒有出現) - 懶得去挖掘什麼;) – kleopatra 2012-02-08 11:14:52

回答

4

按鈕時,它只是似乎不是在某些的LAF :-)

技術上,原因是

  • 熒光筆設置按鈕的背景
  • 默認的視覺效果(使用由提供者設置)將border設置爲由cellContext返回的默認值

組合按鈕看起來不像金屬按鈕(while這是不變的f.i.在Windows中)

沒有令人滿意的解決方案,選項

  • 不使用條紋
  • 釋放按鈕有一個不要觸摸,我的背景屬性,延長ColorHighlighter尊重這一點,使用自定義的熒光筆(在測試包中有一個例子)
+0

這正是我發現的。我會嘗試你提出的第二個選項。謝謝! – ixM 2012-02-08 12:07:03

+0

我怎麼知道按鈕被點擊了(什麼樹路徑,...)? – ixM 2012-02-08 12:27:43

+0

與標準JTable相同的方式:-)閱讀在線教程中的編輯 – kleopatra 2012-02-08 12:46:49