定制 JTable 外观

发布于 2024-10-24 01:00:08 字数 103 浏览 1 评论 0原文

我想创建一个包含几列的 JTable,其中有 JButtons。我可以在 JTable 单元格中创建 JCheckBox 和 JComboBox,但不能在 JButton 中创建。我该怎么做?

I want to create 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 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

指尖凝香 2024-10-31 01:00:08

在我的项目中,这就是我对 3 列 4 行表的做法,其中第一列每行都有 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 单元渲染器

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文