JTable单元格监听器?

12

我正在使用JTable。我需要在单元格选择更改时获得通知。我尝试使用ListSelectionListener,但只有在行选择更改时才会收到通知。如果我在同一行上选择一个新的列,则不会收到通知。我需要知道何时选择了单元格,而不是单元格何时更改。是否有可以用来实现此功能的监听器?

2个回答

11

最简单的方法是调用 setCellSelectionEnabled(true),并将表格的引用传递给监听器。当监听器被调用时,在原始表格上调用 getSelectedRow()getSelectedColumn()

另一种方法是在表格上设置行选择监听器,在ColumnModel上设置列选择监听器,然后找出它们的交集。


我已经在执行选项#1了。问题是只有在行更改时才调用侦听器。例如,如果您从0,0转到0,1,则侦听器不会调用。因此,此选项没有任何作用。对于选项2,我找不到列选择侦听器的侦听器。有一个值更改的侦听器,但我需要一个选择侦听器而不是值更改。 - tadpole
1
@tadpole - JTable.getColumnModel().getSelectionModel()@tadpole - JTable.getColumnModel().getSelectionModel() - parsifal
@tadpole 注册一个TableColumnModelListener并实现它的columnSelectionChanged方法是直接的方式,尽管更深入地与列选择模型进行交互会更短 :-) 顺便说一句,您可能考虑编辑您的答案并删除第一部分。 - kleopatra
+1 -- 最后那个“替代方案”终于对我奏效了。(因为我只能选择一个单元格,所以我不能使用第一种选项。) - Xynariz
2
我发现我需要为ColumnModelSelectionModelJTableSelectionModel添加相同的监听器,以便它能够识别行和列的变化。 - clum

5

一种接收列选择更改通知的方法 - 如@parsifal在评论中已经回答的那样 - 是获取TableColumnModel的内部selectionModel并注册监听器:

table.getColumnModel().getSelectionModel().addListSelectionListener(selectionListener);

另一种方法是使用columnModel注册TableColumnModelListener:

table.getColumnModel().addColumnModelListener(columnModelListener);

第一种方法在代码方面“更短”,只需要实现一个方法,而第二种方法则需要实现多个方法,大多数为空,除了 columnSelectionChanged 方法。
第二种方法对于动态更改更加健壮:使用第一种方法时,无法防范列模型的 selectionModel 属性更改……因为它不是属性。换句话说,在应用程序代码交换 selectionModel 的情况下(虽然这种情况很少见),监听器将无法监听到该变化。安装 columnModelListener 则可以免受此类更改的影响,因为 columnModel 会传递其所选模型的事件。

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