我正在尝试使用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); 遗憾的是,这似乎不起作用。
有没有什么方法可以将clicklistener甚至actionlistener添加到我的treeView中的各个项目中,而无需将treeItems更改为Button类型?
发布于 2013-04-04 03:35:02
根据JavaFX 2.2 documentation的说法:
“..a TreeItem is not a Node,因此不会在TreeItem上触发任何可视事件,要获取这些事件,需要向TreeCell实例添加相关的观察者(通过自定义单元工厂)。”
我认为这篇关于使用TreeView的example在某种程度上会很有用。
发布于 2014-11-03 21:00:27
这可以通过实现CellFactory来解决,但我认为最简单的方法是这样:
1)创建事件处理程序并添加到TreeView中:
EventHandler<MouseEvent> mouseEventHandle = (MouseEvent event) -> {
handleMouseClicked(event);
};
treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle); 2)句柄只在节点上点击(而不是在TreeView的空白处):
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);
}
}发布于 2015-07-05 23:10:26
我在鼠标事件中找不到方法getPickResult,所以也许next比Alex的答案更可取:
1)向树形视图添加监听器
treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> handle(newValue));2)处理点击,不需要区分空格和节点上的点击
private void updateSelectedItem(Object newValue) {
System.out.println(newValue);
}https://stackoverflow.com/questions/15792090
复制相似问题