如何为呈现为复选框的布尔值的JTable单元格添加鼠标监听器

7

我有一个JTable,它使用扩展AbstractTableModel的自定义模型实现。

public abstract class AbstractTable extends AbstractTableModel{

     public Class<? extends Object> getColumnClass(int c) {}
}

因为我实现了getColumnClass方法,所以布尔值在表格中呈复选框形式。我想截取复选框状态的更改,但不幸的是,我不能直接添加鼠标监听器,因为我没有对复选框本身的引用,它并不是由我创建的。
如何设置鼠标监听器以拦截复选框状态更改事件?
编辑:
@jzd的答案是正确的。我可以在setValue方法中捕获更改。但我想知道如何基于鼠标监听器来实现。
4个回答

6
特别是,我希望避免将逻辑放在 setValue() 内部。
在这个可选值的示例中,setValue() 方法没有被覆盖,只更新了内部数据结构并触发了适当的事件。 ValueEditor 继承自 AbstractCellEditor 并实现了 ItemListener,而 ValueRenderer 则继承自 JCheckBox。通过这种方式,编辑器可以监听编辑器内部 itemStateChanged() 中渲染器的 JCheckBox
补充说明:添加 CellEditorListener 是另一种方法,在 JTree 中展示,这里。请注意,JTable 本身就是一个 CellEditorListener

1
+1... 这已经是第十篇Trashgod的帖子了,这周对我在Swing方面帮助很大! - The111
@The111:很高兴能帮忙;我已经更新了答案,以澄清“编辑”和“更新”的区别。 - trashgod
在第一个例子中,创建两个ValueRenderer实例的原因是什么? - Michael Starkie
一个用作单元格渲染器,另一个用作单元格编辑器。 - trashgod

6

我无法抗拒@jzd的建议,但我认为这并不能确保我能够通过TableMode#setValue

基本上有两个选项:

1)TableModelListener

2)据我所知,只有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); 
    //... 
 }

3

似乎添加鼠标监听器是多余的步骤。我建议在模型的setValue()方法中拦截变化。

如果无法更改setValue()方法,则下一个最好的选择是CustomEditor,它将阻止更改,因为这不是从默认布尔编辑器捕获和隐藏鼠标点击的好方法。


可以的。不过我想知道是否也可以使用鼠标监听器,并且如何实现。到目前为止,我一直是这样做的。我的表格模型类有点复杂。我想使用鼠标监听器将我想要执行的状态更改操作与表格模型本身分开。特别是我想避免在setValue中放置逻辑。无论如何,谢谢。 - Heisenbug
1
+1 使用自定义的编辑器和渲染器是正确的方法。我在这里描述了一个示例(链接:https://dev59.com/hVjUa4cB1Zd3GeqPNAHg#6273093)。 - trashgod

0
我曾经遇到过完全相同的问题,我也知道你特别要求一个鼠标监听器来监听复选框编辑器,但是一个解决方法可能是添加一个TableModelListener,如此处所述,在“监听数据更改”部分下,并尝试在检测到更改时模拟行为,但如果你想知道鼠标何时悬停在复选框上或类似的事情 <鼠标的具体操作>,恐怕你必须自己实现单元格编辑器的实现,其中包含这些行为...至少这是我会做的...
问候!...

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