Индивидуальный внешний вид JTable

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


person Deepak    schedule 17.03.2011    source источник
comment
См. раздел Столбец кнопок таблицы; автор скоро придет. :-)   -  person trashgod    schedule 17.03.2011


Ответы (1)


В моем проекте я сделал это для таблицы из 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.

person eee    schedule 17.03.2011
comment
неправильный ответ по нескольким причинам: а) никогда не храните компоненты в модели! Модель предназначена для данных, которые визуализируются компонентом, предоставленным средством визуализации. б) никогда не подкласс JTable (или любой другой JSomething) для нужд приложения, особенно не для выполнения странного жестко закодированного сопоставления значений с визуальными свойствами. - person kleopatra; 30.04.2011