在根JavaFX树视图的子级上禁用上下文菜单<;标签>;与TreeItem<;标签>;

在根JavaFX树视图的子级上禁用上下文菜单<;标签>;与TreeItem<;标签>;,java,javafx,treeview,Java,Javafx,Treeview,此结构中带有TreeItem的JavaFX14Treview 根 团体 孩子 团体 孩子 孩子 我在根目录的标签上附加了一个上下文菜单,用于添加和删除组。当没有组使用时,我可以禁用删除组 removeGroupMenuItem.disableProperty().bind(Bindings.isEmpty(treeView.getRoot().getChildren())); 但是,我现在已将上下文菜单附加到每个组的标签,该标签允许添加一个子项或删除所有子项。我的问题是,如果选

此结构中带有
TreeItem
的JavaFX14
Treview

    • 团体
      • 孩子
    • 团体
      • 孩子
      • 孩子
我在根目录的
标签上附加了一个
上下文菜单
,用于添加和删除组。当没有组使用时,我可以禁用删除组

removeGroupMenuItem.disableProperty().bind(Bindings.isEmpty(treeView.getRoot().getChildren()));
但是,我现在已将
上下文菜单
附加到每个组的
标签
,该标签允许添加一个子项或删除所有子项。我的问题是,如果选择了一个或多个组,如何禁用“删除所有子项”菜单项

我试过不起作用的

removeAllChildrenMenuItem.disableProperty().bind(Bindings.createBooleanBinding(() -> treeView.getSelectionModel().getSelectedItems().stream().flatMap(f -> f.getChildren().stream()).collect(Collectors.toList()).size() == 0, treeView.selectionModelProperty()));

任何想法都欢迎

您的
绑定
不会失效,因为您的代码等待更改的是
SelectionModel
属性,而不是所选项目:

Bindings.createBooleanBinding(()->treeView.getSelectionModel().getSelectedItems().stream().flatMap(f->f.getChildren().stream()).collect(Collectors.toList()).size()==0,treeView.selectionModelProperty());
您可以通过更改绑定的依赖项来修复此问题:

Bindings.createBooleanBinding(()->treeView.getSelectionModel().getSelectedItems().stream().flatMap(f->f.getChildren().stream()).collect(Collectors.toList()).size()==0,treeView.getSelectionModel().getSelectedItems());
注意:如果使用
treeView.setSelectionModel(…)
在代码中的任何其他位置更改树的选择模型,则必须重新绑定
禁用
属性。如果这在代码中很常见,可以向选择模型添加依赖项,使代码如下所示:

Bindings.createBooleanBinding(()->{…},treeView.selectionModelProperty(),treeView.getSelectionModel().getSelectedItems());

这意味着,每当选择模型或所选项目发生变化时,都要重新计算该值。

请..查看组件(如
Label
)不应用作其他组件(如
TreeView
TreeItem
@M.S)的类型。您能解释一下您的推理吗?
模型
表示业务对象。
视图
是该对象的视觉表示。当您使用
TreeView
时,
T
应该是您的
模型
@cbm64,我强烈建议您这样做,但它不会直接解决您的问题。