JavaFXTreeView项目操作事件

JavaFXTreeView项目操作事件,java,event-handling,javafx,Java,Event Handling,Javafx,我正在尝试使用树状视图创建菜单。这是我第一次使用treeView,并且已经在几个网站上阅读了它 当涉及到行动事件时,我遇到了一些问题。我想做的基本上是在用户单击树视图中的某个节点时触发事件。到目前为止,我有以下几点: TreeItem<String> rootItem = new TreeItem<String>("Navigation"); TreeItem<String> statistics = new TreeItem<S

我正在尝试使用树状视图创建菜单。这是我第一次使用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); 
TreeItem rootItem=新的TreeItem(“导航”);
TreeItem statistics=新的TreeItem(“统计”);
TreeItem clan=新TreeItem(“clan页面”);
gran.addEventHandler(MouseEvent,neweventhandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
//TODO自动生成的方法存根
}
});
rootItem.getChildren().add(统计);
rootItem.getChildren().add(clan);
TreeView树=新的TreeView(rootItem);
遗憾的是,这似乎不起作用

是否有任何方法可以将
clicklistener
甚至
actionlistener
添加到我的
树视图中的各个项目中,而无需将
树项更改为键入
按钮

“.TreeItem不是节点,因此不会显示任何可视事件。” 在树上开火,为了得到这些事件,有必要在树上添加相关的观察者 TreeCell实例(通过自定义单元工厂)。”


我认为使用
TreeView
会有所帮助。

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

1) 创建事件处理程序并将其添加到TreeView:

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

treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle); 
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);
    }
}

我在鼠标事件中找不到方法getPickResult,所以也许下一步比Alex的答案更好:

1) 将侦听器添加到树视图

treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> handle(newValue));
2) 处理点击,不需要区分在空白区域和节点上的点击

private void updateSelectedItem(Object newValue) {      
    System.out.println(newValue);
}
treeView.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observevaluemable duplicate question@tarrasalah-这是非个人的用法,但适用于所有树视图。此操作可以,但只需将updateSelectedItem()更改为handle()或任何您想要的操作,但此操作有效。这应该是正确的答案!