Jede node in JTree mit eigenem Icon

DStrohma

Bekanntes Mitglied
Hi,

ich hab hier folgendes Problem: Ich habe einen Vector mit "Report"-Objekten. ich lade jedes dieser Report-Objekte in jeweils eine Node und stelle das Ganze dann in einem JTree dar. Geht auch alles, nur leider schaff ich es nicht dass jede Node ihr eigenes Icon hat...

Bis jetzt habe ich das folgender Maßen:
Java:
        for (ReportTemplate report : reports) {

            // Create node.
            DefaultMutableTreeNode node;
            node = new DefaultMutableTreeNode(report.getNodeName());
            node.setUserObject(report);

            // Set icon for the node.
            DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
            renderer.setLeafIcon(report.getIcon());
            tree.setCellRenderer(renderer);

            // Add node to tree.
            model.insertNodeInto(node, root, root.getChildCount());
            model.reload();

            cardPanel.add(report.getCardPanel(), report.getNodeName());
        }

Das Problem ist hier, dass jede Node genau das Icon hat, das als letztes gesetzt worden ist. Heißt, das LeafIcon wird für jede Node des Baumes gesetzt. Ich will es aber nur für die aktuelle Node setzen. Irgend eine Idee wie das geht?

Ich hab auch schon versucht einen eigenen Renderer zu erstellen und diesem Renderer das Report-Objekt zu übergeben, damit sich der Renderer das Icon aus dem Report-Objekt laden kann. Führt zu dem gleichen Ergebnis.

Java:
        for (ReportTemplate report : reports) {

            // Create node.
            DefaultMutableTreeNode node;
            node = new DefaultMutableTreeNode(report.getNodeName());
            node.setUserObject(report);

            // Set icon for the node.
            ReportCellRenderer renderer = new ReportCellRenderer(report);
            tree.setCellRenderer(renderer);

            // Add node to tree.
            model.insertNodeInto(node, root, root.getChildCount());
            model.reload();

            cardPanel.add(report.getCardPanel(), report.getNodeName());
        }

Und der Renderer:
Java:
public class ReportCellRenderer extends DefaultTreeCellRenderer {
    ReportTemplate report;

    public ReportCellRenderer(ReportTemplate report) {
        this.report = report;
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean selected, boolean expanded, boolean leaf, int row,
            boolean hasFocus) {

        super.getTreeCellRendererComponent(tree, value, selected, expanded,
                leaf, row, hasFocus);

        setIcon(report.getIcon());

        return this;
    }
}
 

sylo

Bekanntes Mitglied
Hi

vielleicht kann ich dir einen Hinweis geben, aber genau weis ich nicht wie es geht. Hab es nicht ausprobiert.

Ich habe mal gesehen, dass einer sich eine eigene Node Klasse geschrieben hat. Dies hat er gemacht um eine Objektvariable namens "valid" hinzuzufügen. Anhand dieser variablen konnte er dann feststellen ob sie gültig ist und diese dann im CellRenderer rot oder schwarz darstellen. Das müsste doch auch bei dir funktionieren, wenn du anstatt einen bool Wert, einen Icon Wert nimmst.

Grüße
sylo
 

KrokoDiehl

Top Contributor
Der Weg über den TreeCellRenderer ist schon gut. Nur musst du im Renderer auf den jeweiligen Knoten zugreifen. In der get-Methode ist der Parameter
Code:
value
der Knoten, der aktuell gerendert werden soll, also dein Report-Objekt. Abhängig von diesem Wert musst du dein Icon bestimmen, dann sollte jeder Knoten im Baum das entsprechende Icon haben.
In Code sieht das etwa so aus:
Java:
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean selected, boolean expanded, boolean leaf, int row,
            boolean hasFocus) {
 
        super.getTreeCellRendererComponent(tree, value, selected, expanded,
                leaf, row, hasFocus);
 
        // von mir erdacht, kA was dein TreeModel als Objekt (tree node) zurückliefert
        ReportObject reportObj = (ReportObject) value;
        setIcon( reportObj.getIcon() );
 
        return this;
    }
 

DStrohma

Bekanntes Mitglied
Ok, habs jetzt hinbekommen. Mein Renderer sieht jetzt so aus:
Java:
public class ReportCellRenderer extends DefaultTreeCellRenderer {

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean selected, boolean expanded, boolean leaf, int row,
            boolean hasFocus) {

        super.getTreeCellRendererComponent(tree, value, selected, expanded,
                leaf, row, hasFocus);

        Object nodeObj = ((DefaultMutableTreeNode) value).getUserObject();

        if (nodeObj instanceof ReportTemplate) {
            setIcon(((ReportTemplate) nodeObj).getIcon());
        }

        return this;
    }
}

Geht soweit also alles, nur seh ich das richtig dass es keine eigene Methode setIcon oder ähnliches für eine Node (also DefaultMutableTreeNode) gibt?? Sobald ich verschiedene Icons haben will brauch ich einen eigenen Renderer?? Kann mir diesen Mangel jemand schlüssig erklären?
 

Michael...

Top Contributor
Sobald ich verschiedene Icons haben will brauch ich einen eigenen Renderer?? Kann mir diesen Mangel jemand schlüssig erklären?
Worin siehst Du da einen Mangel?
Per
Code:
setLeafIcon(...)
sagst Du nur mit welchem Icon der Renderer die "Blätter" zeichnen soll, das hilft ihm noch lange nicht die einzelnen Knoten zu unterscheiden. (Der Standard Renderer unterscheidet nur zwischen "Ast" und "Blatt")
 

DStrohma

Bekanntes Mitglied
Naja, der Mangel ist aus meiner Sicht der, dass ich nicht einfach machen kann:
Code:
node.setIcon(...)
. Das wäre doch das einfachste. Weil wenn ich jetzt nicht immer nur Objekte ein und der selben Klasse in den Baum laden würde, dann gebe es wohl auch keine
Code:
getIcon()
Methode für die Objekte. Wie mach ich das dann. Dann kann ich im Renderer für eine Node kein Icon setzen wenn ich nicht weiß welches Objekt da drin ist...
 

Michael...

Top Contributor
Du könntest ja einen eigenen Knoten so definieren. Müsstest allerdings auch einen passenden CellRenderer dazu schreiben, der mit solchen Objekten umgehen kann.

Ich weiss nicht, ob Dir das Renderer Konzept in Swing klar ist?
Du musst ja unterscheiden zwischen dem logischen Objekt (z.B. DefaultMutableTreeNode) und dessen graphischer Darstellung.
Wie so ein Objekt in z.B. einem JTree aussiehst/dargestellt wird, hängt davon ab was für ein Bildchen der Renderer - aufgrund dessen Informationen über das Objekt - zeichnet. Was man als Knoten im JTree sieht ist ja nicht das Objekt selbst, sondern nur seine Abbildung, erzeugt nach den im Renderer festgelegten Regeln.
Bei JTree ist es -glaube ich so - das für alle Knoten ein Renderer verwendet wird.
Bei JTable kann man für unterschiedliche Objekttypen unterschiedliche Renderer definieren.
 

DStrohma

Bekanntes Mitglied
Das hat mich eben etwas verwundert, weil ich bei JTable für jede Spalte einen Renderer setzen kann. Bei einem JTree hätte ich ursprünglich gedacht dass es für jede Node geht. Ok, dann hab ich das jetzt alles kapiert :D
DANKE!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
B Schlossknacker (Jede mögliche Zahlenkombination ausgeben) Allgemeine Java-Themen 18
AssELAss Best Practice Checksumme über jede Spalte zweier Tabellen und vergleichen Allgemeine Java-Themen 3
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
S readLine() liest nur jede 2. Zeile Allgemeine Java-Themen 3
P readLine() liest nur jede dritte Zeile? Allgemeine Java-Themen 3
M .txt Datei öffnen und jede Zeile mit festem String verketten Allgemeine Java-Themen 5
S Warum benötigt jede Internetseite unbedingt das neuste Java? Allgemeine Java-Themen 11
T Klasse mit neuer Eigenschaft für jede Subclass (kompliziert) Allgemeine Java-Themen 6
F Bluetooth! Jede Antwort hilft! Allgemeine Java-Themen 3
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
L xml node mit attribute auslesen Allgemeine Java-Themen 2
P Serialisiertes Objekt innerhalb einer XML Node Allgemeine Java-Themen 25
G XML Event --> Befüllen einer Node Allgemeine Java-Themen 2
G JTree Node löschen Allgemeine Java-Themen 2
G JTree Node verschieben Allgemeine Java-Themen 2
P /node()[1]/node()[4]/node()[3] in 1:4:3 umwandeln Allgemeine Java-Themen 1
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
F JTree: Nodes dynamisch anlegen via LinkedHashMap Allgemeine Java-Themen 2
E Swing Jtree Allgemeine Java-Themen 9
R JTree - Mehrere Roots Allgemeine Java-Themen 6
DStrohma Icons in JTree Nodes weiter nach rechts rücken Allgemeine Java-Themen 2
M JTree aktualisieren nach Mausklick Allgemeine Java-Themen 12
Benji0815 Verzeichnis wie im Windows Explorer in einem JTree anzeigen Allgemeine Java-Themen 6
S JAVA JTree rekursiv umschreiben Allgemeine Java-Themen 5
S Suche im JTree nach Neuaufbau Allgemeine Java-Themen 4
N JTree nicht genutzte Pfade schließen Allgemeine Java-Themen 2
MQue leerer JTree Allgemeine Java-Themen 6
MQue JTree Allgemeine Java-Themen 6
MQue JCheckBox in JTree Allgemeine Java-Themen 2
F JTree in Jsp Allgemeine Java-Themen 2
T Äquivalent zu JTree Allgemeine Java-Themen 4
C JTree: ActionListener auf die Nodes Allgemeine Java-Themen 3
M JTree mit Rechtsklick markieren Allgemeine Java-Themen 4
C JTree: Nodes automatisch öffnen Allgemeine Java-Themen 2
P JTree/ Nodes einfügen Allgemeine Java-Themen 2
P JTree Allgemeine Java-Themen 6
P aus JTree eine XML- Datei Allgemeine Java-Themen 6
P Vector auf JTree Allgemeine Java-Themen 6
P JTree Farbe Allgemeine Java-Themen 14
S JTree selektion erkennen und drauf reagieren Allgemeine Java-Themen 2
E JTree (schonwieder) - TreeCellEditor Allgemeine Java-Themen 9
E JTree - einzelnes Element (Knoten) editieren Allgemeine Java-Themen 2
E JTree - Selektieren mit Rechtsklick Allgemeine Java-Themen 15
P JTree ID vergeben Allgemeine Java-Themen 3
P JTree Allgemeine Java-Themen 4
P JTree/ JTabbedPane Allgemeine Java-Themen 34
L JTree Allgemeine Java-Themen 23
E root JTree Allgemeine Java-Themen 2
E Child in JTree hinzufügen Allgemeine Java-Themen 4
E JTree in NetBeans Allgemeine Java-Themen 2
R Objekt an Knoten von JTree anhaengen Allgemeine Java-Themen 2
R Daten aus Baum entsprechend in jTree einfuegen Allgemeine Java-Themen 2
T Jtree zu langsam beim klappen Allgemeine Java-Themen 8
S JTree - Brett vor'm Kopp Allgemeine Java-Themen 19
G Baumhierarchie in JTree eintragen Allgemeine Java-Themen 4
K JTree - Knoten expandieren Allgemeine Java-Themen 4
K JTree Inhalt löschen und Anzeige aktualisieren Allgemeine Java-Themen 13
G JTree automatisch sortieren lassen Allgemeine Java-Themen 5
Luma Diskettenlaufwerk rattert los bei Eintrag in JTree Allgemeine Java-Themen 6
G in Jtree suchen Allgemeine Java-Themen 2
K JTree plus eigener FileLoader Allgemeine Java-Themen 2
H Wie stellt ein JTree fest, wo etwas eingehängt werden soll? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben