2013-04-09 3 views
3

JavaFX 2 TreeView에서 노드를 필터링하는 방법은 무엇입니까?Javafx 2 TreeView 필터링

저는 TextField이며, TextField의 내용을 기반으로 모든 노드 (예 : 노드 레이블)를 필터링하려고합니다.

감사합니다.

답변

1

JFX에서 제공하는 특별한 필터는 없습니다.

그래서 직접 구현해야합니다.

TreeItems 항목의 컬렉션을 추적하는 JFX 만 지원합니다. 항목을 추가하거나 제거하면 해당 항목이 추가되거나 제거됩니다. 하지만 콜렉션을 추가하거나 제거하면 스스로 구현됩니다.

+0

어떻게 트리 뷰에서 모든 요소를 ​​제거 할 수 있습니까? –

+0

그냥 뿌리 제거 : treeView.setRoot (null) - treeView 비어있을 것입니다 .. alsom 방법을보세요 : setShowRoot (false); 및 treeView.getRoot(). getItems(). clear(). –

+0

답변 해 주셔서 감사합니다. –

4

이것은 내가 재사용 할 수있는 필터링 가능한 트리 항목 클래스입니다.

필터가 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; 
    } 

} 
+0

영리한! 아주 좋아. –