JavaFX bug,无法为 TableColumn 设置任何事件

问题描述 投票:0回答:1
tableView.getColumns().forEach(column -> {
        column.addEventHandler(MouseEvent.MOUSE_ENTERED, event -> {
            System.out.println("Mouse entered on column: " + column.getText());
        });
    });

这应该有效,对吧?在版本 20、21 和 22 中进行了测试。由于某种原因它不起作用。

javafx
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.