2013-04-09 114 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