Problème
Appliquer le filtrage sur un JTree
pour éviter que certains nœuds/feuilles n'apparaissent dans la version rendue de l'image. JTree
. Idéalement je cherche une solution qui permette d'avoir un filtre dynamique, mais je serais déjà content si je peux faire fonctionner un filtre statique.
Pour rendre les choses un peu plus faciles, supposons que l'option JTree
ne prend en charge que le rendu, et non l'édition. Le déplacement, l'ajout et la suppression de nœuds devraient être possibles.
Par exemple, un champ de recherche au-dessus d'un JTree
et en tapant le JTree
ne montrerait que le sous-arbre avec des correspondances.
Quelques restrictions : il doit être utilisé dans un projet qui a accès au JDK et à SwingX. J'aimerais éviter d'inclure d'autres librairies tierces.
J'avais déjà pensé à quelques solutions possibles, mais aucune ne semblait idéale.
Approches
Filtrage basé sur un modèle
- décorer le
TreeModel
pour filtrer certaines des valeurs. Une version rapide est facile à écrire. Filtrez les noeuds, et à chaque changement du filtre ou du déléguéTreeModel
le décorateur peut déclencher un événement indiquant que l'arbre entier a été modifié (treeStructureChanged
avec le nœud racine comme nœud). Combinez cela avec des listeners qui restaurent l'état de sélection et l'état d'expansion de la fonctionJTree
et vous obtenez une version qui fonctionne plus ou moins, mais les événements provenant de laTreeModel
sont perturbés. C'est plus ou moins l'approche utilisée dans cette question - décorer le
TreeModel
mais essayez de déclencher les bons événements. Je n'ai pas (encore) réussi à trouver une version fonctionnelle de ceci. Il semble qu'il faille une copie du déléguéTreeModel
afin de pouvoir déclencher un événement avec les bons indices enfants lorsque les nœuds sont supprimés du modèle de délégué. Je pense qu'avec un peu plus de temps, je pourrais faire en sorte que cela fonctionne, mais cela ne semble pas correct (le filtrage semble être quelque chose que la vue devrait faire, et non le modèle). - décorer la structure de données utilisée pour créer l'image initiale.
TreeModel
. Cependant, ceci est complètement non réutilisable, et probablement aussi difficile que d'écrire un décorateur pour un fichierTreeModel
Filtrage par vue
Cela semble être la voie à suivre. Le filtrage ne devrait pas affecter le modèle mais seulement la vue.
-
J'ai jeté un coup d'oeil à
RowFilter
classe. Bien que la javadoc semble indiquer que vous pouvez l'utiliser en combinaison avec une classeJTree
:lorsqu'elle est associée à un JTree, une entrée correspond à un nœud.
Je n'ai pas pu trouver de lien entre
RowFilter
(ouRowSorter
) et leJTree
classe. Les implémentations standard deRowFilter
et les tutoriels Swing semblent suggérer queRowFilter
ne peut être utilisé directement qu'avec unJTable
(voirJTable#setRowSorter
). Aucune méthode similaire n'est disponible sur unJTree
-
J'ai aussi regardé le
JXTree
javadoc. Il dispose d'unComponentAdapter
disponible et la javadoc deComponentAdapter
indique unRowFilter
pourrait interagir avec le composant cible, mais je ne vois pas comment faire le lien entre les composants de lRowFilter
et leJTree
-
Je n'ai pas encore examiné comment un
JTable
gère le filtrage avecRowFilter
et on peut peut-être faire la même chose sur une version modifiée d'uneJTree
.
Donc, en bref, je n'ai aucune idée de la meilleure approche à adopter pour résoudre ce problème.
Note : cette question est un double éventuel de cette question mais cette question est toujours sans réponse, la question est plutôt courte et les réponses semblent incomplètes, alors j'ai pensé poster une nouvelle question. Si cela n'est pas fait (la FAQ n'a pas fourni de réponse claire à ce sujet), je mettrai à jour cette question vieille de 3 ans.