2

我有一个TableCellRendererJTable 的自定义(ValueRenderer),单元格是Checkbox.

如本示例所述,我已将一个附加ItemListener到 valueRenderer 以监听复选框的状态更改(选中/取消选中)。

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

你能帮助我吗?

这是我的一些代码:

自定义 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
        */
    }

}
4

1 回答 1

2

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

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

于 2012-01-16T12:30:07.833 回答