我正在使用 JTable。每当单元格选择发生变化时,我都需要收到通知。我尝试使用 ListSelectionListener 但我只在行选择更改时收到通知。如果我在同一行选择一个新列,我不会收到通知。我需要知道何时选择单元格,而不是何时更改单元格。有没有我可以用来做这件事的听众?
2 回答
最简单的方法是调用setCellSelectionEnabled(true)
,并将对表的引用传递给侦听器。当侦听器被调用时,在原始表上调用getSelectedRow()
和。getSelectedColumn()
另一种方法是在表上设置行选择侦听器,在 上设置列选择侦听器ColumnModel
,然后找出它们的交集。
接收列选择更改通知的一种方法 - 正如@parsifal(在评论中)已经回答的那样 - 是获取 TableColumnModel 的内部 selectionModel 并注册一个侦听器:
table.getColumnModel().getSelectionModel().addListSelectionListener(selectionListener);
另一种方法是使用 columnModel 注册一个 TableColumnModelListener:
table.getColumnModel().addColumnModelListener(columnModelListener);
第一个是在代码方面“更短”:只有一个实现方法与几个 - 除了 columnSelectionChanged 之外,大多数是空的。
第二个对动态变化更健壮:第一个不可能防止 columnModel 的 selectionModel 属性的变化......因为它不是一个属性。或者换句话说:在应用程序代码换出 selectionModel 的(公认的罕见)情况下,侦听器正在侦听 Void。安装 columnModelListener 可以避免这种变化,因为 columnModel 会从它的 selectionModel 传递事件,无论它是什么。