treeview - Javafx 2 TreeView 过滤

标签 treeview javafx-2

如何在 JavaFX 2 TreeView 中过滤节点?

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

谢谢。

最佳答案

这是我编写的可重用的可过滤树项目类。

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

}

关于treeview - Javafx 2 TreeView 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15897936/

相关文章:

java - 列出我的 Java 应用程序正在使用的端口

java - 场景加载太慢

java - Eclipse 插件 - TreeViewer 显示大量文本

asp.net - 如何通过单击文本而不是 +/- 来展开 .NET TreeView 节点

java - 需要显示一个可以动态(无限)添加到(java)的树状结构?

c# - 使其他类可以访问方法和控件

delphi - 在边缘上方/附近拖动时滚动 TTreeView

java - 如何在 javaFX 2.0 应用程序中包装 swing 组件

java - 为什么我的 TableView 第一行被选中?

charts - 带有倒 y 轴的图表