使用 TreeItem<Label> 在根 JavaFX TreeView<Label> 的 child 上禁用上下文菜单

Disable Context Menu on a a child of a root JavaFX TreeView<Label> with TreeItem<Label>

在此结构中具有 TreeItem<Label> 的 JavaFX 14 Treview

我已将 ContextMenu 附加到根的 Label 以添加和删除组。当没有组使用时,我可以禁用删除组;

removeGroupMenuItem.disableProperty().bind(Bindings.isEmpty(treeView.getRoot().getChildren()));

不过,我现在已将 ContextMenu 附加到允许添加 child 或删除所有 children 的每个组的 Label。我的问题是,如果选择了一个或多个组,如何禁用全部删除 Children MenuItem

我试过哪个不行;

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

欢迎任何想法!

您的 Binding 不会失效,因为您的代码等待 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(...) 更改树的选择模型,则必须重新绑定 disable 属性 再次。如果这在你的代码中很常见,你可以添加一个依赖到选择模型,这样代码就变成这样:

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

That means, recalculate the value whenever the selection model or the selected items change.