开发者

Customized JTable look

I want to cr开发者_StackOverflow中文版eate a JTable with few columns which has JButtons on it. I can create JCheckBoxes and also JComboBoxes in the JTable cells but not the JButtons. How do i do this ?


In my project, this is how I did it for a 4-row table with 3 columns where the first column has JToggleButton in every row:

The necessary objects...

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

and under the code where we create the table...

    {
        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) {}  
}

As you can see, the important part is the table model, table1Model

To add a new row...

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

edited:

Added missing JToggleButton cell renderer

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜