5

如何在 JavaFX 2 中过滤节点TreeView

我有一个TextField并且我想根据TextField.

谢谢。

4

2 回答 2

11

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

过滤器应该绑定在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;
    }

}
于 2015-12-23T00:45:14.200 回答
1

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

所以你应该自己实现它。

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

于 2013-04-09T09:28:40.397 回答