Dynamic 如何为动态加载的TreeView项目提供EventHandler?

Dynamic 如何为动态加载的TreeView项目提供EventHandler?,dynamic,javafx,treeview,mouseevent,Dynamic,Javafx,Treeview,Mouseevent,目前,我正在编写一个基于数据库的聊天系统。 每个用户的friendlist在登录后在树视图中获取loadet 指: 登录后,我通过以下功能请求用户朋友的姓名, String namest[]=get.getUserFriendNameByUserID(currentUserID) 使用给定的名称将它们作为TreeItem加载到my Friendlist/TreeRootItem“rootItem”中 for(int counter=0;counter{ TreeCell单元=新的TreeCell

目前,我正在编写一个基于数据库的聊天系统。 每个用户的friendlist在登录后在树视图中获取loadet

指: 登录后,我通过以下功能请求用户朋友的姓名,
String namest[]=get.getUserFriendNameByUserID(currentUserID)

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

for(int counter=0;counter
现在添加rootItem时,我会在树视图中看到名称。 但是如果我点击一个名字,给定的MouseEventHandler不会被调用

此外,我只想请求触发MouseEvent的元素的文本,这样我就可以将这些名称提交给一个特殊的函数

我怎么能真的遇到这样的老鼠事件? 如何从动态创建的树元素调用它

谢谢您的帮助:)

切尔斯
Tobi

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

您将需要以下内容:

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 ;
}
TreeView-TreeView;
// ...
treeView.setCellFactory(电视->{
TreeCell单元=新的TreeCell();
cell.textProperty().bind(cell.itemProperty());
cell.addEventHandler(MouseEvent.MOUSE_单击,事件->{
如果(!cell.isEmpty()){
字符串值=cell.getItem();
TreeItem TreeItem=cell.getTreeItem();//如果需要
//过程。。。
}
});
返回单元;
}

TreeItem
s表示数据,而不是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 ;
}
TreeView-TreeView;
// ...
treeView.setCellFactory(电视->{
TreeCell单元=新的TreeCell();
cell.textProperty().bind(cell.itemProperty());
cell.addEventHandler(MouseEvent.MOUSE_单击,事件->{
如果(!cell.isEmpty()){
字符串值=cell.getItem();
TreeItem TreeItem=cell.getTreeItem();//如果需要
//过程。。。
}
});
返回单元;
}

TreeItem
s表示数据,而不是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 ;
}
TreeView-TreeView;
// ...
treeView.setCellFactory(电视->{
TreeCell单元=新的TreeCell();
cell.textProperty().bind(cell.itemProperty());
cell.addEventHandler(MouseEvent.MOUSE_单击,事件->{
如果(!cell.isEmpty()){
字符串值=cell.getItem();
TreeItem TreeItem=cell.getTreeItem();//如果需要
//过程。。。
}
});
返回单元;
}

TreeItem
s表示数据,而不是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 ;
}
TreeView-TreeView;
// ...
treeView.setCellFactory(电视->{
TreeCell单元=新的TreeCell();
cell.textProperty().bind(cell.itemProperty());
cell.addEventHandler(MouseEvent.MOUSE_单击,事件->{
如果(!cell.isEmpty()){
字符串值=cell.getItem();
TreeItem TreeItem=cell.getTreeItem();//如果需要
//过程。。。
}
});
返回单元;
}

很抱歉,我完全不理解这个示例。如果TreeCell不是字符串而是CustomObject,这个示例如何工作?尤其是
cell.textProperty().bind(cell.itemProperty())
我不明白:刚创建的TreeCell对象应该从哪里获得itemProperty?如果它不是
字符串
,那么您要么使用不同的绑定,要么使用
itemProperty
上的侦听器更新文本属性,要么使用覆盖
UpdateItemItem(…)的
TreeCell
实现
。阅读以获得单元格工作原理的完整解释。我尝试了这种方式:结果是,显示0,1,2,3,之后所有内容都为空。我只是不了解概念…对不起,但我根本不理解此示例。如果TreeCell不是字符串而是CustomObject,则此示例如何工作?尤其是
cell.textProperty().bind(cell.itemProperty())
我不明白:刚创建的TreeCell对象应该从哪里获得itemProperty?如果它不是
字符串
,那么您要么使用不同的绑定,要么使用
itemProperty
上的侦听器更新文本属性,要么使用覆盖
UpdateItemItem(…)的
TreeCell
实现
。阅读文章,了解有关细胞工作原理的完整解释。我试过这样做:R