2011-03-17 35 views
1

我想創建一個帶有JButton的幾列的JTable。我可以在JTable單元格中創建JCheckBoxes和JComboBoxes,但不能創建JButtons。我該怎麼做呢 ?定製的JTable外觀

+2

請參見[表格按鈕列](http://tips4java.wordpress.c OM/2009/07/12 /表鍵式柱/);作者很快就會出現。 :-) – trashgod 2011-03-17 03:10:10

回答

1

在我的項目,這是我的3列,其中第一列的每一行中JToggleButton做了一個4行的表:

必需的對象...

private JTable table1; 
private DefaultTableModel table1Model; 
private JScrollPane scrollPane1; 
String[] columnName = {"Button", "Boolean", "Int" }; 

當我們創建表的代碼...

{ 
     JToggleButton[] jTableButton = new JToggleButton[] { new JToggleButton("one"), new JToggleButton("two"), new JToggleButton("three"), new JToggleButton("four")}; 
     table1Model = 
      new DefaultTableModel(
        new Object[][] { { jTableButton[0], false, 1 }, 
            { jTableButton[1], false, 1 }, 
            { jTableButton[2], false, 1 }, 
            { jTableButton[3], false, 1 }}, 
            columnName); 

     table1 = new JTable(table1Model){ 
      /** 
      * 
      */ 
      private static final long serialVersionUID = 1L; 

      @Override 
      public boolean isCellEditable(int rowIndex, int colIndex) { 
       int value = (Integer) table1Model.getValueAt(rowIndex, 2); 

       String blueColor = Color.BLUE; 
       String redColor = Color.RED; 
       String selectedColor = Color.GREEN; 

       String colorValue = selectedColor; 

       if (value > 0) { 
        colorValue = blueColor; //blue 
       } 
       else { 
        colorValue = redColor; //red 
       } 

       return !colorValue.equals(redColor); // Disallow the editing of red cell 
      } 

      @Override 
      public Class<?> getColumnClass(int c) { 
       return getValueAt(0, c).getClass(); 
      } 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer,int rowIndex, int vColIndex) 
      { 
       int value = (Integer) table1Model.getValueAt(rowIndex, 2); 

       String blueColor = Color.BLUE; 
       String redColor = Color.RED; 
       String selectedColor = Color.GREEN; 

       String colorValue = selectedColor; 

       if (value > 0) { 
        colorValue = blueColor; //blue 
       } 
       else { 
        colorValue = redColor; //red 
       } 

       Component c = super.prepareRenderer(renderer, rowIndex, vColIndex); 
       if (!isCellSelected(rowIndex, vColIndex)) 
       { 

        if (vColIndex != 0) { 
         c.setEnabled(!colorValue.equals(redColor)); 
        } 
        else { 
         c.setEnabled(!colorValue.equals(redColor)); 

         if (colorValue.equals(redColor)) 
          c.setBackground(Color.decode(colorValue)); 
        } 

        if (c instanceof JToggleButton && vColIndex == 0){ 
         JToggleButton button = (JToggleButton) c; 
         button.setToolTipText(((JToggleButton) c).getText()); 
        } 

        if ( Color.decode(colorValue).getRed() >= 224 
          && Color.decode(colorValue).getGreen() >= 224 
          && Color.decode(colorValue).getBlue() >= 224){ 

         c.setForeground(Color.gray); 

        } 
        else { 

         c.setForeground(Color.white); 
        } 
       } 
       return c; 
      } 

     }; 

     scrollPane1.setViewportView(table1); 
     table1.setPreferredSize(new java.awt.Dimension(187,290)); 
     table1.setFont(new java.awt.Font("Segoe UI",0,14)); 
     table1.getColumnModel().getColumn(0).setCellRenderer(new JToggleButtonRenderer()); 
    } 

JToggleButtonRenderer.java

class JToggleButtonRenderer extends JToggleButton implements TableCellRenderer { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     if (value == null) 
      return null; 

     if (isSelected) { 
      // cell (and perhaps other cells) are selected 
     } 

     if (hasFocus) { 
      // this cell is the anchor and the table has the focus 
     } 

     return (Component) value; 
    } 

    // The following methods override the defaults for performance reasons 

    @Override 
    public void validate() {} 

    @Override 
    public void revalidate() {} 

    @Override 
    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {} 

    @Override 
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {} 
} 

正如你所看到的,重要的部分是表模型,table1Model

要添加一個新的行...

//id is something you want put on the button text 
table1Model.addRow(new Object[] { new JToggleButton(id), false, 1}); 

編輯:

新增失蹤JToggleButton中單元格渲染器

+1

錯誤的答案有幾個原因:a)永遠不會在模型中存儲組件!該模型用於由呈現器提供的組件呈現的數據b)永遠不會爲應用程序需要爲JTable(或任何其他JSomething)子類,特別是不用於執行奇怪的硬編碼的值到視覺屬性映射 – kleopatra 2011-04-30 13:43:54