tableView.getColumns().forEach(column -> {
column.addEventHandler(MouseEvent.MOUSE_ENTERED, event -> {
System.out.println("Mouse entered on column: " + column.getText());
});
});
这应该有效,对吧?在版本 20、21 和 22 中进行了测试。由于某种原因它不起作用。
A
TableColumn
不是 Node
,因此实际上不是场景图的一部分。它不是为接收输入事件而设计的。此外,TableView
及其默认皮肤都没有在事件调度链中显式包含 TableColumn
,这意味着该列不会接收在其关联单元格上触发的 any 事件。
TableColumn
之所以有像addEventHandler
这样的方法是因为它实现了EventTarget
。为什么要实现这个接口呢?因为列被设计为CellEditEvent
的目标。这就是为什么 API 还包含 onEditStart
等属性。
侦听“列”上的鼠标事件的一种方法是通过单元工厂将事件处理程序添加到cells。
column.setCellFactory(
tc -> {
@SuppressWarnings("unchecked")
var cell = (TableCell<S, T>) TableColumn.DEFAULT_CELL_FACTORY.call(tc);
cell.setOnMouseEntered(System.out::println);
return cell;
});
在这里,您将直接引用鼠标输入的处理程序中的列,或者您可以从单元格中获取该列。当然,如果需要,您可以使用自定义单元实现替换默认单元工厂的使用。
但是,请注意上述内容不会将事件处理程序添加到列header。