Javafx Treeview项目动作事件

时间:2013-04-03 15:52:40

标签: java event-handling javafx

我正在尝试使用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更改为{{1}}类型?

4 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:6)

根据JavaFX 2.2 documentation

  

“..一个TreeItem 一个节点,因此没有视觉事件   在TreeItem上触发,要获取这些事件,有必要添加相关的观察者   TreeCell实例(通过自定义单元工厂)。“

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

答案 2 :(得分:6)

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

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

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

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

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

答案 3 :(得分:0)

treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() {

                @Override
                public void changed(ObservableValue<? extends TreeItem<String>> observable,
                        TreeItem<String> oldValue, TreeItem<String> newValue) {
                    // newValue represents the selected itemTree
                }

            });