2013-04-09 3 views
3

Comment est-il possible de filtrer des nœuds dans un JavaFX 2 TreeView?Javafx 2 Filtrage TreeView

J'ai un TextField et je veux filtrer tous les nœuds (par exemple les étiquettes de nœuds) en fonction du contenu du TextField.

Merci.

Répondre

1

Il n'y a pas de filtre spécial fourni par JFX.

Vous devriez donc l'implémenter vous-même.

Le seul support de JFX que vous avez - suivi de la collection des éléments de TreeItems. Lorsque vous ajoutez ou supprimez un élément, il sera ajouté ou supprimé. Mais en ajoutant ou en supprimant des collections, vous vous implémentez.

+0

Comment puis-je supprimer tous les éléments d'une arborescence? –

+0

juste enlever une racine: treeView.setRoot (null) - treeView deviendra vide .. alsom jeter un oeil sur la méthode: setShowRoot (false); et treeView.getRoot(). getItems(). clear(). –

+0

Merci pour votre réponse! –

4

C'est une classe d'éléments d'arborescence filtrable réutilisable que j'ai écrite.

le filtre doit être lié à predicateProperty, et vous doit utiliser getSourceChildren méthode pour manipuler des éléments d'arborescence.

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

Clever! très bon. –