Отключить контекстное меню на потомке root JavaFX TreeView <Label>с TreeItem <Label> - PullRequest
0 голосов
/ 31 марта 2020

JavaFX 14 Treview с TreeItem<Label> в этой структуре;

  • Root
    • Группа
      • Ребенок
    • Группа
      • Ребенок
      • Ребенок

Я прикрепил ContextMenu к Label на Root для добавления и удаления групп. И я могу отключить удаление групп, когда нет групп, использующих;

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

Любая мысль приветствуется!

1 Ответ

1 голос
/ 31 марта 2020

Ваш 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());

Это означает, что пересчитывайте значение всякий раз, когда изменяется модель выбора или выбранные элементы. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...