java - 监听 JTable 中 JCheckBox 的变化

标签 java swing jtable jcheckbox

如何监听其中包含 JCheckBox 的 JTable 列中的更改?我想知道用户何时选择/取消选择复选框。该列的类设置为 boolean 值,因此它会自动呈现为 JCheckBox。

最佳答案

我认为您想要的是使用 TableModelListener 监听 TableModel 中的数据变化.也可以使用自定义编辑器,但我认为 TableModelListener 是最简单的方法。您重写的 tableChanged 方法可能看起来像这样

@Override
public void tableChanged(TableModelEvent e) {
    int row = e.getFirstRow();
    int column = e.getColumn();
    if (column == BOOLEAN_COLUMN) {
        TableModel model = (TableModel) e.getSource();
        String columnName = model.getColumnName(column);
        Boolean checked = (Boolean) model.getValueAt(row, column);
        if (checked) {
            System.out.println(columnName + ": " + true);
        } else {
            System.out.println(columnName + ": " + false);
        }
    }
}

enter image description here

这是一个完整的运行示例

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class TestTableModelListener {
    private static final int BOOLEAN_COLUMN = 2;

    public TestTableModelListener() {
        JTable table = createTable();
        table.getModel().addTableModelListener(new CheckBoxModelListener());

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JTable createTable() {
        String[] cols = {"COL", "COL", "COL"};
        Object[][] data = {{"Hello", "Hello", false}, {"Hello", "Hello", false}};
        DefaultTableModel model = new DefaultTableModel(data, cols) {
            @Override
            public Class getColumnClass(int column) {
                return column == BOOLEAN_COLUMN ? Boolean.class : String.class;
            }
        };
        JTable table = new JTable(model);
        return table;
    }

    public class CheckBoxModelListener implements TableModelListener {

        public void tableChanged(TableModelEvent e) {
            int row = e.getFirstRow();
            int column = e.getColumn();
            if (column == BOOLEAN_COLUMN) {
                TableModel model = (TableModel) e.getSource();
                String columnName = model.getColumnName(column);
                Boolean checked = (Boolean) model.getValueAt(row, column);
                if (checked) {
                    System.out.println(columnName + ": " + true);
                } else {
                    System.out.println(columnName + ": " + false);
                }
            }
        }
    }

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

关于java - 监听 JTable 中 JCheckBox 的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127156/

相关文章:

java - 我需要以非常具体的方式验证 SSN

Java-适配器设计模式实现变体

java - 两个线程,同一个静态变量,同一个值,并发访问

java - 检查 JFrame 是否打开

java - 在 jtable 的自定义选项中编辑

java - 在 Java 中使用 XPath 和命名空间解析 XML

Java模拟时钟

java - 如何将 2 个 JList 添加到一个 JScrollPane 中?

java - jtable 中整行的删除线

swing - 使用表格单元格标题颜色自定义 jtable 单元格渲染器