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?

10
demandé sur Tom Hawtin - tackline 2009-05-07 01:18:23

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 le TreeModel 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 au TreeModel filtré . Quand le modèle change, je sauve les chemins élargis dans le JTree (en utilisant getExpandedDescendants() ), puis je les ré-élargis plus tard (en utilisant SwingUtilities.invokeLater() ).

    j'ai dû remplacer equals() dans la classe TreeNode 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);
      }
    }
  }
8
répondu Amanda S 2009-05-07 19:10:33

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.)

3
répondu arooaroo 2009-08-14 07:55:22

avez-vous essayé JXTree ? (malheureusement, le site web est en baisse en ce moment, mais vous pouvez google pour les miroirs)

2
répondu Davide 2009-05-07 20:02:43

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.

1
répondu Aakash 2009-05-10 18:32:42

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.

1
répondu Martin Wickman 2012-12-14 10:07:37

tant que c'est un arbre que vous affichez, alors TreeModel qui vous filtre TreeModel devrait être assez simple.

0
répondu Tom Hawtin - tackline 2009-05-06 21:21:19

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é.

0
répondu user101884 2009-05-06 21:58:59