如何在 JavaFX 2 中过滤节点TreeView
?
我有一个TextField
并且我想根据TextField
.
谢谢。
这是我写的可重复使用的可过滤树项类。
过滤器应该绑定在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;
}
}
JFX 没有提供特殊的过滤器。
所以你应该自己实现它。
您拥有的 JFX 的唯一支持 - 跟踪 TreeItems 项目的集合。当您添加或删除一个项目时,它将被添加或删除。但是从您自己实现的集合中添加或删除。