java - 在 itemStateChanged 上获取 TableCellRenderer 的行

标签 java swing jtable jcheckbox tablecelleditor

我有一个用于 JTable 的自定义 TableCellRenderer (ValueRenderer),单元格是一个 Checkbox

我已将 ItemListener 附加到 valueRenderer 以监听此 example 中提到的复选框的状态变化(选中/取消选中) .

我的问题是,在 itemStateChanged(ItemEvent e) 中,我不知道如何获取包含此复选框的行,知道 ItemEvent 源是ValueRenderer。

你能帮帮我吗?

这是我的一些代码:

自定义 TableCellRender:

public class ValueRenderer extends JCheckBox implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
        this.setSelected((Boolean) value);
        return this;
    }

} 

项目监听器:

public class TableRowCheckBoxListener implements ItemListener {

    private JTable hqlRequestTable;

    public TableRowCheckBoxListener(JTable hqlRequestTable) {
        this.hqlRequestTable = hqlRequestTable;
    }

    @Override
    public void itemStateChanged(ItemEvent e) {

        /*How do I get the row which contains the checkbox clicked knowing that :
            e.getSource() == ValueRenderer
            e.getItem() == ValueRender
        */
    }

}

最佳答案

如果您想知道表中的某些值何时发生变化,则不得在渲染器上注册监听器。您必须在表模型上注册一个监听器:这是保存表显示的数据的地方,也是在数据发生任何变化时触发事件的对象。

另一种方法是使用包含 bean 列表的自定义表模型,让表模型修改它所持有的 bean 的属性,并让 bean 在属性更改时触发属性更改事件。然后,您将在 bean 本身上注册监听器,而不是注册表模型监听器(但请注意,表模型仍然必须触发表模型事件)。

关于java - 在 itemStateChanged 上获取 TableCellRenderer 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8879117/

相关文章:

java - 如何在 Java 中高效地构建应用程序网络

java - 如何使用 Jersey 测试框架测试 @WebServlet? (抛出 Http 404 not found)

java - JFrame 构造函数的最佳实践?

java - 如何使用具有 JTable 典型功能的 Prefuse 可视化表格

java - 如何将不同类的数据添加到jtable?

java - JTable 和自定义 JComboBox

java - Antlr树语法

java - 将日期字符串解析为 java.util.Date 时出现非法模式字符 'T'

java - 使用 JFrame

java - PaintComponent 似乎没有被调用或显示