如何为动态加载的TreeViewItem提供事件处理程序?

时间:2014-10-10 13:52:52

标签: dynamic javafx treeview mouseevent

目前我编写了一个基于数据库的聊天系统。 每个用户的好友列表在登录后都会在TreeView中获得loadet。

表示: 登录后,我通过以下Funktion请求useres朋友的名字, String namesSt[] = get.getUserFriendNameByUserID(currentUserID);

使用给定的名称将它们作为TreeItem加载到我的Friendlist / TreeRootItem“rootItem”

for (int counter = 0; counter < namesSt.length; counter++) {
        System.out.println(namesSt[counter]);
        TreeItem<String> item = new TreeItem<String> (namesSt[counter]);

        item.addEventHandler(MouseEvent.MOUSE_CLICKED,handler);

        rootItem.getChildren().add(item);
    }

当我现在添加我的rootItem时,我在TreeView中看到了Names。 但是如果我点击一个名字,就不会调用给定的MouseEventHandler。

此外,我只想请求触发MouseEvent的Element文本,以便我可以将这些名称提交给spekial funktion。

我如何实现这样的MouseEvent? 如何从动态创建的TreeItem中调用它?

感谢您的帮助:)

cheerse 托比

1 个答案:

答案 0 :(得分:3)

TreeItem代表数据,而不是UI组件。所以他们不会生成鼠标事件。您需要在TreeCell上注册鼠标侦听器。为此,请在TreeView上设置单元工厂。单元工厂是一个在需要时创建TreeCell的函数。因此,这也适用于动态添加的树项。

你需要这样的东西:

TreeView<String> treeView ;

// ...

treeView.setCellFactory( tv -> {
    TreeCell<String> cell = new TreeCell<>();
    cell.textProperty().bind(cell.itemProperty());
    cell.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
        if (! cell.isEmpty()) {
            String value = cell.getItem();
            TreeItem<String> treeItem = cell.getTreeItem(); // if needed
            // process ...
        }
    });
    return cell ;
}