Cacher/filtrer des noeuds dans un JTree?
j'ai un objet de données représentées dans un TreeModel
, et j'aimerais afficher seulement une partie de ma JTree
--pour la clarté de l'exposé, disent les feuilles et leurs parents. Comment puis-je cacher/filtrer les nœuds inutiles?
7 réponses
ma mise en œuvre éventuelle:
- ont deux
TreeModel
s, le sous-jacent et le filtré. - quand un changement se produit sur le
TreeModel
sous-jacent , reconstruire leTreeModel
filtré à partir de zéro. Cloner chaque noeud qui doit être visible, et l'ajouter à son premier ancêtre visible dans le filtréTreeModel
(ou la racine si aucun n'est visible). Voir le codez ci-dessous, si vous êtes curieux. -
cela a l'effet secondaire malheureux de s'effondrer chaque chemin que l'utilisateur avait ouvert. Pour contourner cela, j'ai ajouté un
TreeModelListener
auTreeModel
filtré . Quand le modèle change, je sauve les chemins élargis dans leJTree
(en utilisantgetExpandedDescendants()
), puis je les ré-élargis plus tard (en utilisantSwingUtilities.invokeLater()
).j'ai dû remplacer
equals()
dans la classeTreeNode
que j'utilisais pour que les nouveaux noeuds clonés soient les mêmes que les anciens noeuds clonés.
...
populateFilteredNode(unfilteredRoot, filteredRoot);
...
void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode)
{
for (int i = 0; i < unfilteredNode.getChildCount(); i++)
{
TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i);
if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER)
{
populateFilteredNode(unfilteredChildNode, filteredNode);
}
else
{
TreeNode filteredChildNode = unfilteredChildNode.clone();
filteredNode.add(filteredChildNode);
populateFilteredNode(unfilteredChildNode, filteredChildNode);
}
}
}
vous devez être conscient de GlazedLists . C'est une bibliothèque fantastique pour faire des transformations de table Complexes avec peu d'effort. Ils se sont aussi étendus aux arbres. Il peut exiger un peu de refactoring de votre code existant dans la GlazedLists façon de travailler. Mais découvrez la démo et les webémissions pour voir comment elle est puissante. (C'est l'une des bibliothèques Swing essentielles à mon avis, et c'est open source.)
si vous cherchez une solution commerciale, JideSoft dispose d'un treemodel filtrable. À part cela, SwingX a une API de filtre qui fonctionne sur JXTable, JXTreeTable, JXTree et JXList.
Regardez cette implémentation: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm
il crée des sous-classes de DefaultMutableNode en ajoutant une propriété" isVisible " plutôt qu'en enlevant/ajoutant des noeuds du TreeModel.
tant que c'est un arbre que vous affichez, alors TreeModel
qui vous filtre TreeModel
devrait être assez simple.
utilisez le code que vous utilisez pour construire votre(s) TreeNode(s) et reconstruire le (s) TreeNode (s) uniquement en incluant les éléments que vous voulez. Réglez le noeud racine sur le TreeModel avec le noeud racine filtré.