JavaFX 无法为 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个回答
4
投票

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

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