Индивидуальный внешний вид JTable - PullRequest
1 голос
/ 17 марта 2011

Я хочу создать JTable с несколькими столбцами, на которых есть JButtons. Я могу создавать JCheckBoxes, а также JComboBoxes в ячейках JTable, но не в JButton. Как мне это сделать?

1 Ответ

1 голос
/ 17 марта 2011

В моем проекте это было так для 4-рядной таблицы с 3 столбцами, где в первом столбце есть JToggleButton в каждой строке:

Необходимые предметы ...

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

...