Javafx 2 TreeView过滤

Tex*_*uet 5 treeview javafx-2

如何在JavaFX 2中过滤节点TreeView

我有一个TextField,我想根据内容过滤所有节点(例如节点标签)TextField.

谢谢.

kaz*_*vac 10

这是我写过的可重复使用的可过滤树项目类.

过滤器应该绑定在predicateProperty上,并且必须使用getSourceChildren方法来操作树项.

public class FilterableTreeItem<T> extends TreeItem<T> {
    private final ObservableList<TreeItem<T>> sourceChildren = FXCollections.observableArrayList();
    private final FilteredList<TreeItem<T>> filteredChildren = new FilteredList<>(sourceChildren);
    private final ObjectProperty<Predicate<T>> predicate = new SimpleObjectProperty<>();

    public FilterableTreeItem(T value) {
        super(value);

        filteredChildren.predicateProperty().bind(Bindings.createObjectBinding(() -> {
            Predicate<TreeItem<T>> p = child -> {
                if (child instanceof FilterableTreeItem) {
                    ((FilterableTreeItem<T>) child).predicateProperty().set(predicate.get());
                }
                if (predicate.get() == null || !child.getChildren().isEmpty()) {
                    return true;
                }
                return predicate.get().test(child.getValue());
            };
            return p;
        } , predicate));

        filteredChildren.addListener((ListChangeListener<TreeItem<T>>) c -> {
            while (c.next()) {
                getChildren().removeAll(c.getRemoved());
                getChildren().addAll(c.getAddedSubList());
            }
        });
    }

    public ObservableList<TreeItem<T>> getSourceChildren() {
        return sourceChildren;
    }

    public ObjectProperty<Predicate<T>> predicateProperty() {
        return predicate;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 可以使用绑定代替侦听器:Bindings.bindContent(super.getChildren(),filteredChildren); (2认同)

Ale*_*rov 1

没有特殊的过滤器,由 JFX 提供。

所以你应该自己实现它。

JFX 为您提供的唯一支持 - 跟踪 TreeItems 项目的集合。当您添加或删除项目时,它将被添加或删除。但是从您自己实现的集合中添加或删除。