Javafx Treeview项目动作事件

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

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

TreeItem rootItem = new TreeItem("Navigation"); TreeItem statistics = new TreeItem("Statistics"); TreeItem clan = new TreeItem("Clan page"); clan.addEventHandler(MouseEvent, new EventHandler() { @Override public void handle(MouseEvent event) { // TODO Auto-generated method stub } }); rootItem.getChildren().add(statistics); rootItem.getChildren().add(clan); TreeView tree = new TreeView(rootItem); 

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

有没有什么方法可以在我的treeView的各个项目中添加clicklistener甚至actionlistener ,而无需将treeItems更改为treeItems类型?

根据JavaFX 2.2文档 :

“..a TreeItem 不是 Node ,因此不会在TreeItem上触发视觉事件。要获取这些事件,必须将相关的观察者添加到TreeCell实例(通过自定义单元工厂)。”

我认为这个使用TreeView 例子在某种程度上是有用的。

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

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

 EventHandler mouseEventHandle = (MouseEvent event) -> { handleMouseClicked(event); }; treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle); 

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); } } 

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

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

 treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> handle(newValue)); 

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

 private void updateSelectedItem(Object newValue) { System.out.println(newValue); }