2013-04-09 117 views

回答

1

没有特殊的过滤器,通过JFX提供。

所以你应该自己实现它。

从JFX你唯一的支持 - 的TreeItems'项目收集的跟踪。添加或删除项目时,将添加或删除项目。但是添加或删除您自己实现的集合。

+0

我如何从树视图中删除所有元素? – 2013-04-09 09:43:26

+0

只是删除一个根:treeView.setRoot(null) - 树视图将变成空的.. alsom看看方法:setShowRoot(false);和treeView.getRoot()。getItems()。clear()。 – 2013-04-09 09:49:38

+0

感谢您的回答! – 2013-04-09 10:01:21

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

聪明!很好。 – 2017-12-16 22:14:54