2011-03-04 2 views
2

mon problème est ceComment ajouter des lacunes à un JTree

J'essaye de créer un composant qui affiche deux arbre côte à côte. Les deux arbres seront généralement très similaires mais auront probablement une ou deux différences. Là où il y a une différence, c'est-à-dire une branche dans l'une mais pas dans l'autre, je voudrais que l'arbre sans la branche montre un espace vide pour cela, et pour chacun de ses enfants disparus aussi.

Il pourrait ressembler à

 
left tree  right tree 
------------  ------------- 
+ Root   + Root 
|    | 
--Child A  --Child A 
|    | 
--Child B  | 
|    | 
--Child C  --Child C 

Son relativement simple pour supprimer le texte et une icône pour les lignes qui devraient être des lacunes en utilisant un moteur de rendu personnalisé. Cependant, cela laisse toujours la ligne horizontale qui relie un enfant à la ligne verticale des parents. Et ceci est mon problème.

 
left tree  right tree 
------------  ------------- 
+ Root   + Root 
|    | 
--Child A  --Child A 
|    | 
--Child B  -- <--I want to remove this 
|    | 
--Child C  --Child C 

Il est peut-être bareable dans cet exemple simple, mais quand la branche manque a des enfants aussi je finis avec beaucoup de petites lignes reliant les lacunes.

Une alternative potentielle Je pense est de créer un JTreeTable d'une colonne pour chaque arbre et vide les cellules pour les branches manquantes. Bien que cela signifie qu'une partie de la ligne verticale sera également perdue.

Toute aide, des idées ou des commentaires seront très appréciés. Merci.

Répondre

3

Considérez ce qui suit:

class ReticentTreeUI extends BasicTreeUI { 

    private Set<Integer> hiddenRows = new HashSet<Integer>(); 

    public void hideRow(int row) { 
     hiddenRows.add(row); 
    } 

    @Override 
    protected void paintHorizontalPartOfLeg(Graphics g, 
     Rectangle clipBounds, Insets insets, Rectangle bounds, 
     TreePath path, int row, boolean isExpanded, 
     boolean hasBeenExpanded, boolean isLeaf) { 
     if (!hiddenRows.contains(row)) { 
      super.paintHorizontalPartOfLeg(g, clipBounds, insets, bounds, 
       path, row, isExpanded, hasBeenExpanded, isLeaf); 
     } 
    } 

    @Override 
    protected void paintRow(Graphics g, Rectangle clipBounds, 
     Insets insets, Rectangle bounds, TreePath path, int row, 
     boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) { 
     if (!hiddenRows.contains(row)) { 
      super.paintRow(g, clipBounds, insets, bounds, path, row, 
       isExpanded, hasBeenExpanded, isLeaf); 
     } 
    } 

    @Override 
    protected void paintExpandControl(Graphics g, Rectangle clipBounds, 
     Insets insets, Rectangle bounds, TreePath path, int row, 
     boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) { 
     if (!hiddenRows.contains(row)) { 
      super.paintExpandControl(g, clipBounds, insets, bounds, 
       path, row, isExpanded, hasBeenExpanded, isLeaf); 
     } 
    } 
} 

Exemple d'utilisation:

JTree tree = new JTree(); 
    ReticentTreeUI ui = new ReticentTreeUI(); 
    tree.setUI(ui); 
    ui.hideRow(2); 
+2

+1 Code Reformaté; s'il vous plaît revenir si incorrect. – trashgod

+0

Merci n0weak, cela a fait l'affaire. – Jamesy82

Questions connexes