2011-11-24 73 views
2

我做了一個顯示JPanel的自定義TableCellRenderer。當JPanel包含交互式元素時,我希望這些元素也能工作,所以我製作了一個自定義的TableCellEditor。它可以工作,但點擊JPanel時會出現一些奇怪的行爲。點擊時有時候JPanel會消失。 當我只設置自定義渲染器時,根本沒有問題,除了JPanel不是交互式的。所以這個問題必須在TableCellEditor中。JPanel作爲TableCellEditor消失

編輯:

public class PanelTableCellEditor 
     extends AbstractCellEditor 
     implements TableCellEditor 
{ 
    private Object _component; 

    @Override 
    public Object getCellEditorValue() 
    { 
     return _component; 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, 
               boolean isSelected, int row, 
               int column) 
    { 
     _component = value; 
     if (value instanceof JPanel) 
     { 
      ((Component) value).setForeground(UIManager.getColor("List.selectionForeground")); 
      ((Component) value).setBackground(UIManager.getColor("List.selectionBackground")); 
      return ((Component) value); 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

渲染:

public class PanelTableCellRenderer 
     extends Component 
     implements TableCellRenderer 
{ 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
                boolean isSelected, 
                boolean hasFocus, int row, 
                int column) 
    { 
     if (value instanceof JPanel) 
     { 
      if (isSelected || hasFocus) 
      { 
       ((Component) value).setForeground(UIManager.getColor("List.selectionForeground")); 
       ((Component) value).setBackground(UIManager.getColor("List.selectionBackground")); 
      } 
      else 
      { 
       ((Component) value).setForeground(UIManager.getColor("Panel.foreground")); 
       ((Component) value).setBackground(UIManager.getColor("Panel.background")); 
      } 

      return ((Component) value); 
     } 
     else 
     { 
      return new DefaultTableCellRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     } 
    } 
} 

在主窗體我有下面的代碼:

DefaultTableModel model = new DefaultTableModel(); 
     model.addColumn(null, new Object[] 
       { 
        jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1 
       }); 
     jTable1.setModel(model); 
     TableColumn column = jTable1.getColumnModel().getColumn(0); 
     column.setCellRenderer(new PanelTableCellRenderer()); 
     column.setCellEditor(new PanelTableCellEditor()); 
     jTable1.setRowHeight(50); 
     jTable1.setTableHeader(null); 
     jScrollPane2.setColumnHeaderView(null); 
+0

請閱讀http://stackoverflow.com/questions/5555938/how-to-make-a-jbutton-in-a-jtable-cell-click-able – mKorbel

回答

1

有兩個問題,我在這裏看到:

* 重複放置的AWT/SWING組件是一個不可否認的! *

1)向面板中添加相同的元件兩次會導致問題。 Swing不喜歡同一個組件存在於不同的位置 - gui的狀態,dedrawing等等,都是基於一個組件的模型 - 一個位置。我過去遇到類似的問題,因爲它被多次添加,組件變爲空白...

缺少變量?

2)變量jPanel1/jPanel2未在代碼中的任何位置定義。我認爲這在你的實際代碼中並不是問題,所以如果你顯示這些定義,可能還有其他問題。

+0

面板是在別處定義和創建的。有重複項目的事實將解釋事情。我認爲揮杆可以解決這個問題。 – siebz0r