如何将一个鼠标监听器添加到JTable的单元格中,该单元格保持一个呈现为复选框的布尔值
我有一个JTable,其中实现了一个扩展AbstractTableModel的自定义模型。
public abstract class AbstractTable extends AbstractTableModel{ public Class getColumnClass(int c) {} }
因为我已经实现了getColumnClass方法,所以布尔值会像复选框一样呈现在表中。 我想截取复选框的状态更改,但不幸的是我不能直接添加鼠标监听器,因为我没有对复选框本身的引用,它不是由我创建的。
如何设置鼠标侦听器来拦截复选框状态更改事件?
编辑:
@jzd的答案是对的。 我可以在setValue方法中捕获更改。 但我想知道如何实现基于鼠标监听器的方法。
特别是,我想避免将逻辑放在
setValue()
。
在此可选值的示例中,不会覆盖setValue()
方法, 除非更新内部数据结构并触发相应的事件 。 ValueEditor
扩展AbstractCellEditor
并实现ItemListener
,而ValueRenderer
扩展JCheckBox
。 通过这种方式,编辑器可以在编辑器的itemStateChanged()
监听渲染器的JCheckBox
。
附录:添加CellEditorListener
是另一种方法, 此处显示为JTree
。 请注意, JTable
本身是一个CellEditorListener
。
我无法抗拒@jzd的建议真的没有,我认为不是,不能确保我通过TableMode#setValue
,
但基本上有两种选择
1)TableModelListener
2)AFAIK只有TableCellEditor#isCellEditable可以与JTable中的JCheckBox或JRadioButton连接
public boolean isCellEditable(EventObject getEvent) { MouseEvent me = (MouseEvent) getEvent; JTable table = (JTable) (me.getSource()); Point point = me.getPoint(); int column = table.columnAtPoint(point); int row = table.rowAtPoint(point); Rectangle rec = table.getCellRect(row, column, true); //... }
似乎添加一个鼠标监听器是一个额外的步骤。 我建议拦截模型的setValue()
方法的变化。
如果你不能改变setValue()
方法,那么下一个最好的东西是一个将阻止更改的CustomEditor
,因为即使从默认的布尔编辑器,这也不是捕获和隐藏鼠标单击的好方法。
我遇到了完全相同的问题,而且我也知道你专门要求一个鼠标监听器进入复选框编辑器,但是一个workarround可能会添加一个TableModelListener
,如“Listening for Data Changes”部分所述,并尝试模拟当您检测到更改时的行为,但如果您想知道鼠标何时位于复选框或类似<鼠标的特定操作>之类的内容,我担心您必须自己实现单元格编辑,实现这些行为……至少那就是我要做的……
素不相识的!…