Javafx - Скрыть TreeTableRow на основе содержимого данных - PullRequest
0 голосов
/ 27 февраля 2020

Я создал TableTree, который содержит объект класса Component с логическим свойством «selected». Я хочу скрыть строки из таблицы, где компонент строк не выбран. Я попытался это сделать:

componentTree.setRowFactory(new Callback<TreeTableView<Component>, TreeTableRow<Component>>() {
    @Override
    public TreeTableRow<Component> call(TreeTableView<Component> param) {
        TreeTableRow<Component> row = new TreeTableRow<Component>() {
            @Override
            protected void updateItem(Component component, boolean empty) {
                if(!empty) {
                    if (!component.isSelected()) {
                        setVisible(false);
                        setManaged(false);
                        System.out.println("hide");
                    } else {
                        setVisible(true);
                        setManaged(true);
                        System.out.println("show");
                    }
                }
            }
        };
        return row;
    }
});

В system.out я вижу много сообщений "показать" и "скрыть", но это не влияет на таблицу, все строки отображаются, как и раньше.

Есть идеи по этому поводу c?

Спасибо!

1 Ответ

0 голосов
/ 27 февраля 2020

Я использовал библиотеку eclipse fx.ui.controls для того же самого достижения той же цели.

<dependency>
    <groupId>at.bestsolution.eclipse</groupId>
    <artifactId>org.eclipse.fx.ui.controls</artifactId>
    <version>2.2.0</version>
</dependency>

Библиотека предоставляет класс: FilterableTreeItem<T> в пакете дерева. Этот класс был разработан для использования в таких случаях, как ваш. Вы можете указать Predicate для root дерева, и элементы будут скрыты при изменении заданного значения:

// Children
final FilterableTreeItem<Component> childNode1 = new FilterableTreeItem<>(component1);
final FilterableTreeItem<Component> childNode2 = new FilterableTreeItem<>(component2);
final FilterableTreeItem<Component> childNode3 = new FilterableTreeItem<>(component3);

// Root
final FilterableTreeItem<Component> root = new FilterableTreeItem<>(rootComponent);
root.getInternalChildren().setAll(childNode1, childNode2, childNode3);
root.setPredicate((parent, value) -> value.isSelected());

// TreeTableView
final TreeTableView<Component> treeTableView = new TreeTableView<>(root);

Обратите внимание, что вы должны использовать getInternalChildren() для добавления потомков и по умолчанию getChildren().

FilterableTreeItem<T> также предоставляет predicateProperty(), который можно привязать к другому свойству в случае, если вам необходимо обновить способ отображения или скрытия элементов.

Еще одно преимущество этот класс показывает, что он показывает весь путь до root элементов, соответствующих этому предикату.

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