使用 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
;
- 根目录
- 集团
- Child
- 集团
- Child
- Child
我已将 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.
在此结构中具有 TreeItem<Label>
的 JavaFX 14 Treview
;
- 根目录
- 集团
- Child
- 集团
- Child
- Child
- 集团
我已将 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.