繁体   English   中英

<Label>使用 TreeItem</label>在根 JavaFX TreeView 的子项上禁用上下文菜单

[英]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附加到允许添加子项或删除所有子项的每个组的Label 我的问题是,如果选择了一个或多个组,我如何禁用删除所有子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());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM