2009-05-07 6 views
2

En utilisant la nouvelle version de l'apparence de substance pour Java, les lignes de connexion dans un JTree typique ne sont pas tracées (lignes parent-enfant).Lignes de connexion JTree dans la substance

Dans le forum officiel dans java.net quelqu'un a demandé le same thing et la réponse du développeur pour cela est que c'était un choix basé sur les nouvelles interfaces utilisateur et il n'y a pas de plan pour implémenter l'option dans le futur. Sa réponse a également dit que vous pourriez implémenter cela vous-même en sous-classant la classe SubstanceUI et en implémentant les méthodes paintHorizontalPartOfLeg/paintVerticalPartOfLeg. Est-ce que quelqu'un peut expliquer le processus nécessaire ou peut-être me donner un exemple?

Je suis sûr que quelqu'un doit avoir fait cela car c'est un choix très étrange de la part du développeur de ne pas dessiner ces lignes.

Répondre

4

Tout cela va de la mémoire. Je vais modifier si je trouve quelque chose de mal avec ça demain.

consultez BasicTreeUI ou MetalTreeUI. Je crois qu'ils peignent tous les deux des lignes. Ce que vous devez faire est de créer une nouvelle classe qui étend (j'imagine sur le nom ici) SubstanceTreeUI et écraser paintHorizontalPartOfLeg() et paintVerticalPartOfLeg(). Ensuite, vous avez le choix:

  1. Vous pouvez appeler myTree.setUI (nouveau MyTreeUI())
  2. UIManager.getDefaults() mettre ("TreeUI", MyTreeUI.class.getName()) à un moment donné. avant de faire votre DTree

Si vous ne voulez pas sous-classe, essayez UIManager.getDefaults(). mettre (« TreeUI », BasicTreeUI.class.getName()) et voir si cela semble correct.

EDIT 2: Après un examen plus loin, il serait plus facile de simplement appeler .setUI (nouveaux BasicTreeUI()) sur votre DTree ou appelez UIManager.getDefaults() mettre ("TreeUI", BasicTreeUI.class.getName().) avant de créer votre arbre.

EDIT:
SubstanceTreeUI est un cubclass de BasicTreeUI. Il a remplacé paintXXXPartOfLeg().

Horiz:

@Override 
protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds, 
     Insets insets, Rectangle bounds, TreePath path, int row, 
     boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) { 
    boolean toPaint = (!this.tree.isEnabled()) 
      || this.isInside 
      || !FadeConfigurationManager.getInstance().fadeAllowed(
        SubstanceLookAndFeel.TREE_DECORATIONS_ANIMATION_KIND, 
        tree); 
    if (FadeTracker.getInstance().isTracked(this.tree, SubstanceLookAndFeel.TREE_DECORATIONS_ANIMATION_KIND)) { 
     Graphics2D graphics = (Graphics2D) g.create(); 
     graphics.setComposite(TransitionLayout 
       .getAlphaComposite(this.tree, 
         FadeTracker.getInstance() 
          .getFade10(this.tree,SubstanceLookAndFeel.TREE_DECORATIONS_ANIMATION_KIND)/10.0f, 
          g)); 
     super.paintHorizontalPartOfLeg(graphics, clipBounds, insets, 
       bounds, path, row, isExpanded, hasBeenExpanded, isLeaf); 
     graphics.dispose(); 
    } else if (toPaint) { 
     super.paintHorizontalPartOfLeg(g, clipBounds, insets, bounds, path, 
       row, isExpanded, hasBeenExpanded, isLeaf); 
    } 
} 

Il semble que les lignes ne sont peintes si l'une des conditions suivantes est remplie:

  • L'arbre n'est pas activé, la souris est dans les limites des arbres [cette .inside] et fading (?) ne sont pas autorisés sur l'arbre [! FadeConfigurationManager.getInstance(). fadeAllowed (...)]
  • Le FadeTracker suit le JTree [FadeTracker.getInstance(). isTracked (...)]

Figure comment assurer que le JTree est suivi par le FadeTracker ou essayez ce hack très rude (voir ci-dessous):

Vous pouvez également couper et coller le code de méthodes paintXXXPartOfLeg de BasicTreeUI dans une sous-classe.

public MyTree extends JTree { 
    private boolean overrideIsEnable = false; 
    public void setOverrideIsEnable(boolean b) { overrideIsEnabeld=true; } 
    public boolean isOverrideIsEnable(boolean b) { return overrideIsEnabeld; } 
    public boolean isEnabled() { 
     if(overrideIsEnabled) return false; 
     return super.isEnabled(); 
    } 
} 


class MyTreeUI extends SubstanceTreeUI { 
protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds, 
     Insets insets, Rectangle bounds, TreePath path, int row, 
     boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) { 
if(this.tree instanceof MyTree) 
try { 
    Field f = SubstanceTreeUI.class.getDeclaredField("inside"); 
    f.setAccessible(true); 
    Boolean v = (Boolean)f.get(this); 
    f.set(this,Boolean.true); 
    ((MyTree)this.tree).setOverrideIsEnable(true); 
} catch(Throwable t) { 
    //want to default back to substanceUI if this fails. 
} 
super.paintHoriz.....(); 
try{ 
    f.set(this,v); 
    ((MyTree)this.tree).setOverrideIsEnable(true); 
}catch(Throwable t) { 
    //see above 
} 
} 
//repeat for Vertical 
} 
+0

Nous vous remercions de votre réponse.Ce qui m'intéresse vraiment, c'est comment exactement je dessine les lignes une fois que je sous-classe et implémente les méthodes. (Attention, la classe substanceUI n'a pas ces méthodes, ce n'est pas un descendant de BasicUI). Pourriez-vous peut-être me donner un petit exemple ou me diriger vers une direction où je peux trouver des informations? –

+0

S'il vous plaît jeter un oeil à ma réponse éditée. FYI Vous ne voulez pas regarder SubstanceUI, vous voulez regarder SubstanceTreeUI, qui (selon google) a les deux méthodes. – KitsuneYMG

+0

merci beaucoup. Votre réponse est juste sur place. très utile. –