2009-05-07 7 views
2

Mit der neuen Version des Substanz-Look-and-Feel für Java werden die Verbindungslinien in einem typischen JTree nicht gezeichnet (Eltern-Kind-Linien).JTree-Verbindungslinien in Substance

Im offiziellen Forum in java.net fragte jemand die same thing und die Antwort des Entwicklers für dieses ist, dass es eine Wahl war, die auf den neueren UIs basiert und es keinen Plan gibt, die Option in der Zukunft zu implementieren.

In seiner Antwort heißt es auch, dass Sie dies selbst implementieren könnten, indem Sie die SubstanceUI-Klasse ableiten und die paintHorizontalPartOfLeg/paintVerticalPartOfLeg-Methoden implementieren.

Kann jemand den erforderlichen Prozess erklären oder mir ein Beispiel geben? Ich bin mir sicher, dass jemand das getan haben muss, da es im Namen des Entwicklers eine sehr seltsame Entscheidung ist, diese Zeilen nicht zu zeichnen.

Antwort

4

Das geht alles aus dem Speicher. Ich werde bearbeiten, wenn ich morgen etwas falsch finde.

überprüfen Sie BasicTreeUI oder MetalTreeUI. Ich glaube, sie malen beide Linien.

Was Sie tun müssen, ist eine neue Klasse zu erstellen, die SubstanceTreeUI erweitert (ich vermute den Namen hier) und überschreiben PaintHorizontalPartOfLeg() und PaintVerticalPartOfLeg(). Dann haben Sie die Wahl:

  1. Sie können myTree.setUI nennen (neu MyTreeUI())
  2. UIManager.getDefaults() setzen ("TreeUI", MyTreeUI.class.getName()) zu einem bestimmten Zeitpunkt. bevor Sie Ihre JTree

wenn Sie zu Unterklasse nicht machen wollen, versuchen UIManager.getDefaults(). setzen ("TreeUI", BasicTreeUI.class.getName()) und sehen, ob das in Ordnung aussieht.

EDIT 2: Nach einer weiteren Prüfung wäre es einfacher, nur .setUI (neu BasicTreeUI()) auf dem JTree anrufen oder rufen UIManager.getDefaults() setzen ("TreeUI", BasicTreeUI.class.getName().) bevor Sie Ihren Baum erstellen.

EDIT:
SubstanceTreeUI ist eine Cubclass von BasicTreeUI. Es hat paintXXXPartOfLeg() außer Kraft gesetzt.

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); 
    } 
} 

Es sieht aus wie die Linien nur gemalt werden, wenn eine der folgenden zutrifft:

  • Der Baum ist nicht aktiviert, ist die Maus in die Baumgrenzen [diese .inside] und Fading (?) ist in der Struktur nicht erlaubt [! FadeConfigurationManager.getInstance(). fadeAllowed (...)]
  • Der FadeTracker verfolgt den JTree [FadeTracker.getInstance(). isTracked (...)]

Herauszufinden, wie sichergestellt wird, dass die JTree durch die FadeTracker oder versuchen, diesen sehr groben Hack (siehe unten) verfolgt wird:

Sie

auch paintXXXPartOfLeg Methoden in eine Unterklasse den Code aus BasicTreeUI des schneiden können und einfügen.

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

Vielen Dank für Ihre Antwort.Was mich eigentlich interessiert, ist, wie genau zeichne ich die Linien, wenn ich die Methoden subclass und implementiere. (Beachten Sie, dass die Klasse substantUI diese Methoden nicht hat. Sie ist kein Nachkomme von BasicUI). Könnten Sie mir vielleicht ein kleines Beispiel geben oder auf eine Richtung zeigen, in der ich Informationen finden kann? –

+0

Bitte werfen Sie einen Blick auf meine bearbeitete Antwort. FYI Sie wollen nicht auf SubstanceUI schauen, Sie wollen SubstanceTreeUI, die (nach google) hat beide Methoden. – KitsuneYMG

+0

vielen Dank. Ihre Antwort ist direkt vor Ort. sehr hilfreich. –