首页 > 解决方案 > 在根 JavaFX TreeView 的子项上禁用上下文菜单

问题描述

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

我已将一个附加ContextMenuLabel根目录以添加和删除组。当没有组使用时,我可以禁用删除组;

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

但是,我现在已附加ContextMenuLabel每个允许添加孩子或删除所有孩子的组。MenuItem我的问题是,如果选择了一个或多个组,我如何禁用删除所有子项。

我试过哪个不起作用;

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

欢迎任何想法!

标签: javajavafxtreeview

解决方案


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());

这意味着,只要选择模型或所选项目发生更改,就会重新计算该值。


推荐阅读