JavaFX 2 TreeView
에서 노드를 필터링하는 방법은 무엇입니까?Javafx 2 TreeView 필터링
저는 TextField
이며, TextField
의 내용을 기반으로 모든 노드 (예 : 노드 레이블)를 필터링하려고합니다.
감사합니다.
JavaFX 2 TreeView
에서 노드를 필터링하는 방법은 무엇입니까?Javafx 2 TreeView 필터링
저는 TextField
이며, TextField
의 내용을 기반으로 모든 노드 (예 : 노드 레이블)를 필터링하려고합니다.
감사합니다.
JFX에서 제공하는 특별한 필터는 없습니다.
그래서 직접 구현해야합니다.
TreeItems 항목의 컬렉션을 추적하는 JFX 만 지원합니다. 항목을 추가하거나 제거하면 해당 항목이 추가되거나 제거됩니다. 하지만 콜렉션을 추가하거나 제거하면 스스로 구현됩니다.
이것은 내가 재사용 할 수있는 필터링 가능한 트리 항목 클래스입니다.
필터가 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.setRoot (null) - treeView 비어있을 것입니다 .. alsom 방법을보세요 : setShowRoot (false); 및 treeView.getRoot(). getItems(). clear(). –
답변 해 주셔서 감사합니다. –