java - 使用 TreeItem 在根 JavaFX TreeView 的子项上禁用上下文菜单
问题描述
Treview
具有TreeItem<Label>
此结构的 JavaFX 14 ;
- 根
- 团体
- 孩子
- 团体
- 孩子
- 孩子
- 团体
我已将一个附加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());
这意味着,只要选择模型或所选项目发生更改,就会重新计算该值。
推荐阅读
- c++ - 带有自定义类的共享指针语法背后的任何原因,模板如下
- php - 如何使用下拉列表发送排序
- javascript - 如何使 ReactJS onClick 函数更改文本区域的值?
- python - 创建用于将非字母数字字符转换为破折号的 Python 类
- c# - 循环为列表中的每个对象添加一个json
- reactjs - 在 React 中使用 Jest 和 Enzyme 进行测试时遇到错误
- android - 我们可以使用多个按钮从内部存储中选择文件并使用相同的按钮上传到数据库吗
- .net - 如何将 Docker 容器的相对路径重新映射到外部环境中的绝对路径?
- python - 将嵌套 python 列表简化为结构化树的最佳方法(同时保留顺序)
- spring-boot - 在 Axios 中向 Spring Boot Server 发送 RequestParam