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
及其默认皮肤都没有明确包含事件调度链中的列,这意味着没有列会接收在其关联单元格上触发的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。