怎麼可能在一個JavaFX 2 TreeView
過濾節點?JavaFX的2 TreeView控件過濾
我有一個TextField
,我想根據TextField
的內容過濾所有節點(例如節點標籤)。
謝謝。
怎麼可能在一個JavaFX 2 TreeView
過濾節點?JavaFX的2 TreeView控件過濾
我有一個TextField
,我想根據TextField
的內容過濾所有節點(例如節點標籤)。
謝謝。
沒有特殊的過濾器,通過JFX提供。
所以你應該自己實現它。
從JFX你唯一的支持 - 的TreeItems'項目收集的跟蹤。添加或刪除項目時,將添加或刪除項目。但是添加或刪除您自己實現的集合。
這是可重複使用的過濾樹的物品類別中我已經寫了。
過濾器應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;
}
}
聰明!很好。 – 2017-12-16 22:14:54
我如何從樹視圖中刪除所有元素? – 2013-04-09 09:43:26
只是刪除一個根:treeView.setRoot(null) - 樹視圖將變成空的.. alsom看看方法:setShowRoot(false);和treeView.getRoot()。getItems()。clear()。 – 2013-04-09 09:49:38
感謝您的回答! – 2013-04-09 10:01:21