List in JTree umwandeln

Status
Nicht offen für weitere Antworten.

m0ps

Mitglied
Tag zusammen,
neues Problem:

Ich habe eine Liste mit Objekten, die Strings enthalten. Also sowas wie Objekt1("Auto","Mercedes","c-Klasse}, Objekt2("Auto","BMW","3er"), Objekt3("Motorad","Suzuki","irgendeinModel"), usw...

Aus dieser Liste möchte ich einen JTree bauen ala:

-Fahrzeuge
...-Auto
......-Mercedes
.........-c-Klasse
......-BMW
.........-3er
...-Motorad
......-Suzuki
.........-irgendeinModel
usw

ANMERKUNG: die Objekte sind schon nach den Strings sortiert, also erst kommen alle "Autos", diese unterglieder sich in alle "mercedes", dann alle "BMWs" usw...

Leider weiß ich nicht wie ich das realisieren soll.
Meine erste Überlegung war mit dem ersten Objekt in der Liste einen Tree zu "starten" und dann immer das gerade betrachtete Objekt mit dem Vorherigen zu vergleichen, ob es mit den Knoten übereinstimmt. Ist dies nicht der Fall, wird ein neuer Knoten erstellt.

Bei der Umsetzung scheiterts dann aber :) Habs mit drölf "if"-Abfragen probiert, aber dann wieder verworfen.
Habt ihr dazu vielleicht einen Vorschlag/eine Lösung?

Grüße
m0ps
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Wir können z.B. zuerst alle Kategorien anlegen, dann alle Marken, und schliesslich alle Modelle. Dann brauchen wir uns nicht darum zu kümmern, ob der Vaterknoten jeweils schon angelegt ist oder nicht. Zum Auffinden des jeweiligen Vaterknotens können wir uns eine Methode bauen. die den Baum rekursiv durchläuft.
 

m0ps

Mitglied
Danke für deine Antwort.

Hm, ist die Methode nicht ziemlich aufwendig, wenn ich die Liste für das initialisieren der Knoten durchlaufen muss + dann nochmal um die Elemente zuzuweisen?

Greetz
m0ps
 

Ebenius

Top Contributor
Wir können z.B. zuerst alle Kategorien anlegen, dann alle Marken, und schliesslich alle Modelle. Dann brauchen wir uns nicht darum zu kümmern, ob der Vaterknoten jeweils schon angelegt ist oder nicht. Zum Auffinden des jeweiligen Vaterknotens können wir uns eine Methode bauen. die den Baum rekursiv durchläuft.
Wenn die Daten schon sortiert vorliegen, dann kann man's auch noch einfacher machen. Beispiel:
Java:
final List<String[]> flatData = new ArrayList<String[]>();
flatData.add(new String[] { "A", "1", "i" });
flatData.add(new String[] { "A", "1", "ii" });
flatData.add(new String[] { "A", "2", "i" });
flatData.add(new String[] { "B", "1", "i" });
flatData.add(new String[] { "B", "1", "ii" });
flatData.add(new String[] { "B", "1", "iii" });

final DefaultMutableTreeNode root = new DefaultMutableTreeNode();
final Stack<DefaultMutableTreeNode> stack =
      new Stack<DefaultMutableTreeNode>();
for (String[] row : flatData) {
  // adjust stack to match level
  final Iterator<DefaultMutableTreeNode> stackIt = stack.iterator();
  for (int level = 0; level < row.length && stackIt.hasNext(); level++) {
    if (!stackIt.next().getUserObject().equals(row[level])) {
      stack.setSize(level);
      break;
    }
  }

  // rebuild trail of stack
  for (int level = stack.size(); level < row.length; level++) {
    final String s = row[level];
    final DefaultMutableTreeNode child = new DefaultMutableTreeNode(s);
    (stack.isEmpty() ? root : stack.peek()).add(child);
    stack.push(child);
  }
}
Ebenius
 

André Uhres

Top Contributor
Hm, ist die Methode nicht ziemlich aufwendig, wenn ich die Liste für das initialisieren der Knoten durchlaufen muss + dann nochmal um die Elemente zuzuweisen?
Ich weiss nicht, was du mit "aufwendig" meinst. Meine Version würde etwa so aussehen (vom Code her imho nicht besonders aufwendig):
Java:
private JTree tree;
private DefaultMutableTreeNode parent;

private void buildTree(final List<String[]> flatData) {
    for (int level = 0; level < 3; level++) {
        for (String[] fahrzeug : flatData) {
            DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(fahrzeug[level]);
            parent = (DefaultMutableTreeNode) tree.getModel().getRoot();
            findParent(tree.getModel().getRoot(), fahrzeug, level);
            if (parent != null) {//null = besteht schon
                ((DefaultTreeModel)tree.getModel()).insertNodeInto(newChild, parent, parent.getChildCount());
            }
        }
    }
}

private void findParent(final Object o, final String[] fahrzeug, final int level) {
    int cc = tree.getModel().getChildCount(o);
    for (int i = 0; i < cc; i++) {
        DefaultMutableTreeNode child = (DefaultMutableTreeNode) tree.getModel().getChild(o, i);
        if (child.getLevel() == level && child.toString().equals(fahrzeug[level - 1])) {
            parent = child;
        } else if (child.getLevel() == (level + 1) && child.toString().equals(fahrzeug[level])) {
            parent = null;//besteht schon
        }
        if (!tree.getModel().isLeaf(child)) {
            tree.expandPath(new TreePath(child.getPath()));
            findParent(child, fahrzeug, level);
        }
    }
}
 

Ebenius

Top Contributor
Macht halt zur Laufzeit um Längen mehr Aufwand; bekommt man natürlich nur bei größeren Datenmengen mit.

Ebenius
 

André Uhres

Top Contributor
Eben, und nur beim Laden der Daten. Es wurden auch keine extrem ungewöhnliche Gegebenheiten erwähnt. Zudem könnten wir uns fragen, ob so grosse Datenmengen in einem JTree überhaupt noch Sinn machen würden.
 

Ebenius

Top Contributor
Müssen wir aber nicht. :)

Ich wollte lediglich darauf hinweisen, dass es einen weniger aufwändigen Weg gibt, wenn die Daten schon sortiert vorliegen. Habe ich getan.

Ebenius
 

André Uhres

Top Contributor
Auf die entsprechende Frage des Themenerstellers hin wollte ich nur zeigen, daß meine Version leistungsfähig genug und vom Code her nicht sehr aufwendig ist.
 

tomier

Aktives Mitglied
Ich finde diese Lösung echt beeindruckend.
Ich hätte nur eine Frage:
Wenn ich z.B. hätte als Eigenschaften pro Objekt ("A", "1", "i", "2000EURO,"5LiterVerbrauch") und will aber den Tree genauso nur nach den 3 Kriterien("A", "1", "i") aufbauen, ABER wenn mit einem Listener die anderen 2 Eigenschaften zusätzlich auch abrufen will, ist das mit dieser Lösung auch möglich?


Wenn die Daten schon sortiert vorliegen, dann kann man's auch noch einfacher machen. Beispiel:
Java:
final List<String[]> flatData = new ArrayList<String[]>();
flatData.add(new String[] { "A", "1", "i" });
flatData.add(new String[] { "A", "1", "ii" });
flatData.add(new String[] { "A", "2", "i" });
flatData.add(new String[] { "B", "1", "i" });
flatData.add(new String[] { "B", "1", "ii" });
flatData.add(new String[] { "B", "1", "iii" });

final DefaultMutableTreeNode root = new DefaultMutableTreeNode();
final Stack<DefaultMutableTreeNode> stack =
      new Stack<DefaultMutableTreeNode>();
for (String[] row : flatData) {
  // adjust stack to match level
  final Iterator<DefaultMutableTreeNode> stackIt = stack.iterator();
  for (int level = 0; level < row.length && stackIt.hasNext(); level++) {
    if (!stackIt.next().getUserObject().equals(row[level])) {
      stack.setSize(level);
      break;
    }
  }

  // rebuild trail of stack
  for (int level = stack.size(); level < row.length; level++) {
    final String s = row[level];
    final DefaultMutableTreeNode child = new DefaultMutableTreeNode(s);
    (stack.isEmpty() ? root : stack.peek()).add(child);
    stack.push(child);
  }
}
Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JTree aus List<File> erstellen AWT, Swing, JavaFX & SWT 8
M Array List in JTree AWT, Swing, JavaFX & SWT 2
MiMa Obseved List mit ListView (Dateiliste) AWT, Swing, JavaFX & SWT 4
AmsananKING JavaFX Quiz cant fill List AWT, Swing, JavaFX & SWT 1
L Swing Wert vom Textfield in Array List hinzufügen AWT, Swing, JavaFX & SWT 2
M List Listener AWT, Swing, JavaFX & SWT 37
Q-bert Doppelclick auf einem List item AWT, Swing, JavaFX & SWT 9
H Java FX List<AlbumsBean> in FXML TableView AWT, Swing, JavaFX & SWT 37
J private statische List - Datenbankverbindung AWT, Swing, JavaFX & SWT 2
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
B Map, Set oder List in GUI ausgeben AWT, Swing, JavaFX & SWT 5
G AWT List AWT, Swing, JavaFX & SWT 4
yvesdaeschle List Control mit "card"-Ansicht AWT, Swing, JavaFX & SWT 7
S AWT AWT.List bug oder feature AWT, Swing, JavaFX & SWT 4
E Keine Ausgabe auf Console und List AWT, Swing, JavaFX & SWT 13
reibi SWT SWT - List - DeSelection Problem AWT, Swing, JavaFX & SWT 5
P Kennt awt.list keine Tastatureingabe? AWT, Swing, JavaFX & SWT 3
E werte aus List auslesen AWT, Swing, JavaFX & SWT 2
P List in JTextField ausgeben AWT, Swing, JavaFX & SWT 8
S AWT List: Items überschreiben? AWT, Swing, JavaFX & SWT 6
H SWT Zeilenumbruch in List AWT, Swing, JavaFX & SWT 9
M SWT keine Scrollbar bei widgets.List und GridLayout AWT, Swing, JavaFX & SWT 2
L Swing JList - Warum Vector und nicht List ? AWT, Swing, JavaFX & SWT 4
P List-Einträge auslesen AWT, Swing, JavaFX & SWT 4
S List<String> in JTextArea! AWT, Swing, JavaFX & SWT 4
I List aus einer JList AWT, Swing, JavaFX & SWT 3
G Objekte in SWT List AWT, Swing, JavaFX & SWT 3
S List übertragen in Label? AWT, Swing, JavaFX & SWT 4
S List Elemente AWT, Swing, JavaFX & SWT 4
G Drag And Drop von Component (List, Tree) zum Desktop AWT, Swing, JavaFX & SWT 2
B List, Item makieren per rechtsklick AWT, Swing, JavaFX & SWT 3
L Renderer mit nativen komponenten in tabelle / tree / list AWT, Swing, JavaFX & SWT 4
G Frage zur List mit chars AWT, Swing, JavaFX & SWT 7
C Menue verschwindet hinter AWT-List Box.wie beheben? AWT, Swing, JavaFX & SWT 3
S List mit mehrfarbiger Beschriftung AWT, Swing, JavaFX & SWT 2
G AWT: List mehrere Spalten. AWT, Swing, JavaFX & SWT 8
O java.awt.list - string ändern AWT, Swing, JavaFX & SWT 2
P Image und Text in einer List anzeigen AWT, Swing, JavaFX & SWT 12
I Farbe bei List und TextArea AWT, Swing, JavaFX & SWT 1
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
B JTree AWT, Swing, JavaFX & SWT 9
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben