如何在JTABLE swing中添加复选框

16

有人知道如何将JCheckBox放入JTable列中吗?就像这样:

Table from the table tutorial

我从如何使用表格中获取了此信息。

提前致谢。


5
你尝试过什么? - Brian Roach
4
Swing教程会告诉你如何做这件事,我建议你去看一下。 - Hovercraft Full Of Eels
在创建表后,您可以获得“复选框”列,然后以类似的方式setCellEditor( layersTable.getDefaultEditor( Boolean.class ) )和单元格渲染器。 PS. 很遗憾这个问题已经关闭了,我无法回答,这是一个非常适合快速回答的问题 :( - Line
1个回答

50

1) JTable默认已经具备内置的JCheckbox和Boolean TableCellRenderers and TableCellEditor,因此不需要再声明其相关内容。

2) AbstractTableModel应该很有用,在JTable中,可以通过它来减少/限制/更改继承自DefaultTableModel的嵌套方法。

3) 考虑使用DefaultTableModel(如果您对其工作原理不确定),而不是AbstractTableModel

table_with_BooleanType_column

可以从简单的代码生成:

import javax.swing.*;
import javax.swing.table.*;

public class TableCheckBox extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTable table;

    public TableCheckBox() {
        Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
        Object[][] data = {
            {"Buy", "IBM", new Integer(1000), new Double(80.50), false},
            {"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
            {"Sell", "Apple", new Integer(3000), new Double(7.35), true},
            {"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
        };
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            /*@Override
            public Class getColumnClass(int column) {
            return getValueAt(0, column).getClass();
            }*/
            @Override
            public Class getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Integer.class;
                    case 3:
                        return Double.class;
                    default:
                        return Boolean.class;
                }
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                TableCheckBox frame = new TableCheckBox();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocation(150, 150);
                frame.setVisible(true);
            }
        });
    }
}

12
不应为与数据相关的原因而对表进行子类化:明显是_model_的责任返回正确的类,视图_must not_猜测它。 - kleopatra
3
  1. 我从未听说过子类化问题,真心不理解,可能需要通过发布一个明显的例子或链接到详细订阅来澄清动机。
  2. 或许我之所以只针对Swift层级阻止非子类化代码,是因为有最深层次的原因,仅供OP参考。
  3. 想象一下,:-)
- mKorbel
5
默认的JTable#getColumnClass方法会执行以下操作:return getModel().getColumnClass(convertColumnIndexToModel(column));。如果用户移动表格列,这个"解决方案"将会失效。应该重写TableModel#getColumnClass方法。 - Dennis
2
你的代码已经被无耻地复制到这里。我已经向版主举报了该帖子作者的行为。 - Hovercraft Full Of Eels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接