Javafx Treeview项目动作事件

Mar*_*sen 4 java javafx event-handling

我正在尝试使用treeView创建菜单.这是我第一次使用treeView并在几个网站上阅读它.

在动作事件方面我遇到了一些问题.我想要做的基本上是当用户点击树视图中的节点时触发和事件到目前为止我有以下内容:

        TreeItem<String> rootItem = new TreeItem<String>("Navigation");
    TreeItem<String> statistics = new TreeItem<String>("Statistics");
    TreeItem<String> clan = new TreeItem<String>("Clan page");
    clan.addEventHandler(MouseEvent, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            // TODO Auto-generated method stub

        }
    });

    rootItem.getChildren().add(statistics);
    rootItem.getChildren().add(clan);

    TreeView<String> tree = new TreeView<String>(rootItem); 
Run Code Online (Sandbox Code Playgroud)

可悲的是,这似乎不起作用.

有没有什么办法可以在不改变类型的情况下为我的个别项添加一个clicklistener甚至是一个?actionlistenertreeViewtreeItemsButton

Ale*_*dre 13

这可以通过实现CellFactory来解决,但我认为最简单的方法是这样的:

1)创建并向TreeView添加事件处理程序:

EventHandler<MouseEvent> mouseEventHandle = (MouseEvent event) -> {
    handleMouseClicked(event);
};

treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle); 
Run Code Online (Sandbox Code Playgroud)

2)只处理节点上的点击(而不是在TreeView上的empy空间上):

private void handleMouseClicked(MouseEvent event) {
    Node node = event.getPickResult().getIntersectedNode();
    // Accept clicks only on node cells, and not on empty spaces of the TreeView
    if (node instanceof Text || (node instanceof TreeCell && ((TreeCell) node).getText() != null)) {
        String name = (String) ((TreeItem)treeView.getSelectionModel().getSelectedItem()).getValue();
        System.out.println("Node click: " + name);
    }
}
Run Code Online (Sandbox Code Playgroud)


tar*_*lah 6

根据JavaFX 2.2文档:

"..A TreeItem是不是一个节点,因此没有视觉事件将在TreeItem被解雇,为了得到这些事件,有必要对相关观察家添加到TreeCell实例(通过自定义细胞工厂)."

我认为这个关于使用的例子TreeView某种程度上是有用的.


use*_*407 6

我在鼠标事件中找不到方法getPickResult,所以也许接下来比Alex回答更好:

1)将监听器添加到树视图中

treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> handle(newValue));
Run Code Online (Sandbox Code Playgroud)

2)处理点击,不需要区分空白空间和节点上的点击

private void updateSelectedItem(Object newValue) {      
    System.out.println(newValue);
}
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但只需将 updateSelectedItem() 更改为 handle() 或任何您想要的,但这有效。这应该是正确答案! (3认同)