JTree

BlubBlub

Bekanntes Mitglied
Hi,
ich wollte einen JTree erstellen und mit Daten füllen.
Der übersichtlichkeithalber wollte ich das erstellen der ganzen Knoten
in einer anderen Klasse auslagern.
Also dachte ich mir ich schreibe Code wie den der unter "Mein Vorgehen" zu sehen ist.
Das Problem ist allerdings, dass das nicht funktioniert.
Wenn man das Standardvorgehen wählt, dann muss man
JTree tree = new JTree(rootNode);
also man übergibt im Konstruktor den rootNode. Anschließend kann man den Tree einfach in
ein Panel oder JFrame einbetten.
Bei meinem Code weiß ich aber nicht was ich mit den rootNode machen soll nachdem ich ihn
fertig erstellt habe mit allen Unterknoten. Ein add(rootNode) geht nicht. Und super() kann ich auch
nicht einfach den rootNode übergebe, da super() gleich zu beginn aufgerufen werden muss und ich
da logischerweise meinen rootNode noch nicht erstellt habe.
Was muss ich korigieren damit mein Baum korrekt angezeigt wird?

Standard:
Java:
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Fields");
rootNode.add(...);
JTree tree = new JTree(rootNode);
JScrollPane treeScrollPane = new JScrollPane(tree);
add(treeScrollPane);


Mein Vorgehen:
Java:
public class MyTree extends JTree
{
           super();
           DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Fields");
           rootNode.add(...);

           add(rootNode); // Nicht erlaubt
}

MyTree tree = new MyTree();
JScrollPane treeScrollPane = new JScrollPane(tree);
add(treeScrollPane);
 
B

Beni

Gast
Setz ein neues Model mit deinem neuen Root:

Java:
JTree tree = ...
TreeNode rootNode = ...
tree.setModel( new DefaultTreeModel( rootNode ));
 

BlubBlub

Bekanntes Mitglied
Das versteh ich noch nicht so ganz.
Meine momentane Ausgangslage ist:

Java:
public class MyTree extends JTree
{
           super();
           DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Fields");
           rootNode.add(...);
 
           add(rootNode); // Nicht erlaubt
}
 
MyTree tree = new MyTree();
JScrollPane treeScrollPane = new JScrollPane(tree);
add(treeScrollPane);
Ich hab in dieser Klasse meine recht komplizierte Baumstruktur erstellt.


Und nun soll ich also sowas machen:
Java:
JTree tree = ...
TreeNode rootNode = ...
tree.setModel( new DefaultTreeModel( rootNode ));

Ich versteh nicht ganz wo da jetzt meine Klasse MyTree() sein soll.
Weil das was du ja schreibst unterscheidet sich kaum vom Standardverfahren, welches ich
oben gezeigt habe.
Sowohl bei dem Standarvorgehen als auch bei deinem muss ich erst den rootNode komplett fertig erstellen.
Bei deinem Vorschlag müsste ich also auch einen ellenlangen Code zwischen
JTree tree = ... und tree.setModel(new DefaultTreeModel(rootNode)) erstellen bei dem mir der rootNode erstellt wird. Meine Absicht ist es aber nun diesen ellenlangen Code zu kapseln um die Übersicht zu erhalten und Änderung später leicher vornehmen zu können.

Ich wüßte schon ne alternative Lösung indem ich eine Klasse erstelle die eine statische Methode anbietet welche mir den rootPane mit allen seinen Unterknoten erzeugt und zurückgibt. Dann könnte ich es so lösen:
Java:
public class MyRootNodeCreator() 
{
             public MyRootNodeCreator()
             {
             }

             public static DefaultMutableTreeNode create()
             {
                      DefaultMutableTree rootNode = new DefaultMutableTreeNode();
                      rootNode.add(...) 
                       //Ellenlange komplizierte Baumstruktur

                      return rootNode;
             }
}

DefaultMutableTreeNode rootNode = MyRootNodeCreater.create();
JTree tree = new JTree(rootNode);
JScrollPane treeScrollPane = new JScrollPane(tree);
add(treeScrollPane);
Nur dachte ich ich könnte direkt einen fertigen Baum erstellen den ich einfach nur noch in
ein JFrame oder JPanel integrieren kann.

Vielleicht sagst du mir das richtige, aber so ganz kann ich dem grad noch nicht folgen.
 

Michael...

Top Contributor
Grundsätzliche Frage: Deine Klasse erbt von JTree. Aber erweitert Deine Klasse tatsächlich JTree bzw. warum erbst sie?

Üblicherweise gibt man einer Klasse auch einen "echten" Konstruktor.
Verwende ein TreeModel z.B. das vorgeschlagene DefaultTreeModel, das kann man jederzeit setzen - auch im Konstruktor nach einem super Aufruf.
 
B

Beni

Gast
Sorry, ich war etwas kryptisch.

Dein "MyTree" ist ein "JTree", also hat dein MyTree auch die Methode "setModel" (Vererbung: alles was die Superklasse hat, hat auch die Subklasse). Du kannst also aus deinem Konstruktor aus "setModel" aufrufen.
Java:
public class MyTree extends JTree{
     public MyTree(){
           super();
           DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Fields");
           rootNode.add(...);
 
           // add(rootNode); // Nicht erlaubt
           setModel( new DefaultTreeModel( rootNode ));
    }
}

Was das kapseln angeht, das ist natürlich eine gute Idee. Du kannst aus dem Konstruktor jederzeit ein paar Methoden aufrufen, die müssen auch nicht statisch sein. Vielleicht wäre es ganz gut, pro Knoten eine Methode zu haben, also irgendwie sowas:
Java:
public class MyTree extends JTree{
     public MyTree(){
           super();
           DefaultMutableTreeNode rootNode = createRoot();
 
           // add(rootNode); // Nicht erlaubt
           setModel( new DefaultTreeModel( rootNode ));
    }

    private DefaultMutableTreeNode createRoot(){
        DefaultMutabelTreeNode root = new DefaultMutabelTreeNode("Fields");
        root.add( createFieldA() );
        root.add( createFieldB() );
        return root;
    }

    private DefaultMutableTreeNode createFieldA(){
        DefaultMutabelTreeNode node = new DefaultMutabelTreeNode("A");
        node.add( nochEinKnoten() );
        return node;
    }

    private DefaultMutableTreeNode createFieldB(){
        DefaultMutabelTreeNode node = new DefaultMutabelTreeNode("A");
        return node;
    }

    ... // und noch viele weitere Methoden
}

Eine andere Idee: mach für jeden Knoten eine Klasse. Also eine Klasse "RootNode", "FieldNodeA", "FieldNodeB"... oder was immer du haben willst.
Java:
public class RootNode extends DefaultMutableTreeNode{
   public RootNode(){
      super( "Fields" );
      add( new FieldNodeA() );
      add( new FieldNodeB() );
      add( ... ); // noch mehr Knoten
   }
}

Und zum Schluss muss ich noch sagen, dass Michaels Frage berechtigt ist. Hat dein MyTree irgendeine Besonderheit die JTree nicht hat? In vielen Fällen wird ein Program übersichtlicher, wenn man auf Vererbung sparsam einsetzt.
 

BlubBlub

Bekanntes Mitglied
Okay danke für die Antwort =)

Und zum Schluss muss ich noch sagen, dass Michaels Frage berechtigt ist. Hat dein MyTree irgendeine Besonderheit die JTree nicht hat? In vielen Fällen wird ein Program übersichtlicher, wenn man auf Vererbung sparsam einsetzt.

Nee hat es nicht. Aber ich erstelle eine komplexen Editor und da hab ich drei Bereiche. Einen MainPanel(JPanel), dann ein JTree und ein PropertPane (JPanel). Und um das Programm ein wenig zu struktuieren und die Übersicht zu behalten, sowie Änderungen später leicht vornehmen zu können, wollte ich eine eigene Klasse für JTree verwenden in der gleichzeitig die Knoten drin erstellt werden.
Das Programm wird nämlich mehrere tausend Zeilen Code habe, das ist der einzige Grund weshalb ich eine Klasse von JTree ableite die keine besonderen Zusätze hat.
 

BlubBlub

Bekanntes Mitglied
Klassen bzw. die daraus erzeugten Objekte können auch einen JTree "besitzen".

Das versteh ich nicht ganz. Was meinst du damit? Welcher Grund oder welche Gründer sprechen in diesem Fall dagegen eine von JTree abgeleitete eigene Klasse zu verwenden?
 

Marco13

Top Contributor
Ohne den ganzen Thread gelesen zu haben, nur zur letzten Frage: Man sollte eher defensiv sein, was Vererbung angeht. Also nicht willkürlich von irgendwelchen Klassen erben, ohne, dass dafür ein driftiger Grund besteht. (Das wird manchmal auch als Merksatz "Favor Composition over Inheritance" zusammengefasst).

Insbesondere, wenn man selbst keine besondere Funktionalität hinzufügt, besteht kein Grund, zu erben. Als plakatives Beispiel:
Java:
class MyTree extends JTree
{
    public MyTree() {
        setFoo(...); // Lauter Aufrufe
        setBar(...); // von Methoden
        doThis(...); // die sowieso
        doThat(...); // 'public' sind
    }
}
so eine Klasse macht i.a. keinen Sinn. Genausowenig wie man eine Klasse schreiben würde wie
Java:
class ArrayListWith123 extends ArrayList 
{
    public ArrayListWith123()
    {
        add(1);
        add(2);
        add(3);
    }
}
:D

Aber nochmal: Das nur, ohne den Thread gelesen zu haben, und damit ohne den Zusammenhang zu kennen. Vielleicht macht das Erben bei dir auch Sinn.
 

BlubBlub

Bekanntes Mitglied
Alles klar danke. Aber ich denke dennoch dass es in diesem Fall durchaus berechtigt ist von JTree abzuleiten, ohne die Klasse zu erweitern um die Übersicht zu bewahren und um den Code nur an einer zentralen Stelle ändern zu müssen. Zumindest in meinem Falle wo ich viel Code verwende.

Falls der einzige Grund der dagegen sprechen sollt nur lautet:
"Favor Composition over Inheritance"
Denn wenn die Funktionalität weiterhin gleich bleibt und sich nichts verändert, ist der Satz meines Achtens eher eine Richtlinie als eine zwingend zu befolgende Regelung. Man muss halt beim jeweiligen Fall abwägen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5
1 Swing JTree collapse child nodes AWT, Swing, JavaFX & SWT 4
B JTree - sehr individuell AWT, Swing, JavaFX & SWT 3
G Swing JTree - Verbindungslinien entfernen AWT, Swing, JavaFX & SWT 4
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
L Swing JTree wird nicht selektiert AWT, Swing, JavaFX & SWT 2
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
A JTree aus Pfaden erzeugen AWT, Swing, JavaFX & SWT 3
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
X Datensätze in JTree AWT, Swing, JavaFX & SWT 2
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
E JTree Auswahl AWT, Swing, JavaFX & SWT 2
K JTree width der Treenodes auf 100% AWT, Swing, JavaFX & SWT 6
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
Landei Swing JTree mit "Tabellenzeilen"? AWT, Swing, JavaFX & SWT 5
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
Z JTree rootChilds AWT, Swing, JavaFX & SWT 2
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
E Swing JTree AWT, Swing, JavaFX & SWT 2
J Swing Lazy Loading in JTree wenn gescrollt wird AWT, Swing, JavaFX & SWT 3
N Knotenanordnung in JTree AWT, Swing, JavaFX & SWT 4
S JTree mit Liste zur Speicherung AWT, Swing, JavaFX & SWT 3
S Jtree CheckNode mit JPanel AWT, Swing, JavaFX & SWT 32
G JTree entfernt Nodes nicht AWT, Swing, JavaFX & SWT 12
C Swing JTree und TreeModel AWT, Swing, JavaFX & SWT 15
S Swing JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
J JTree AWT, Swing, JavaFX & SWT 2
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
E Swing JTree setSelectedPath funktioniert nicht?! AWT, Swing, JavaFX & SWT 5
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
S JTree aus List<File> erstellen AWT, Swing, JavaFX & SWT 8
C Swing MouseEntered(?) für jeden Node im JTree AWT, Swing, JavaFX & SWT 4
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Swing JTree UI Probleme AWT, Swing, JavaFX & SWT 6
G JTree - Observer oder Listener? AWT, Swing, JavaFX & SWT 6
L Swing [JTree] Selektierte Nodes nummerieren AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben