Einen einfachen JTree anhand eines Arrays aufbauen

Status
Nicht offen für weitere Antworten.
F

Fabian85

Gast
Hallo,
ich hänge gerade den ganzen Tag an einer Aufgabe und komme einfach weiter und nun bin ich auf dieses Forum gestoßen. Es geht um folgendes: Gegeben ist ein Array mit den folgenden Beispiel Einträgen:

static final String [] folderPathNames = {
"Dateien/Musik/Rock/Abba",
"Dateien/Musik/Rock/Zappa",
"Dateien/Musik/Jazz",
"Dateien/Bilder/Februar 2008",
"Dateien/Bilder/März 2008",
"Dateien/Bilder/April 2008",
"Dateien/Bilder/April 2008/bis 15.04.",
"Dateien/Bilder/April 2008/ab 15.04."
};

Anhand dieses Arrays, in welchem einzelne Ordnerpfade gespeichert sind, soll nun ein JTree aufgebaut werden.
Dazu ist in der Methode buildTree() das Array entsprechend auszuwerten und mit Hilfe von DefaultMutableTreeNodes in einen JTree einzufügen. Sämtliche Ansätze hatten einfach nicht hingehaut. Irgendwo ist dann immer ein Haken :-(
Ich bin zwar noch ziemlicher Anfänger, aber es ärgert mich doch sehr, dass ich diese Aufgabe nun einfach nicht lösen kann.
Meine Idee war eigentlich, dass ich zunächst einen Wurzelknoten erzeuge,dann alles einfach an diese Wurzel hänge und diese schließlich dem Tree übergebe. Das Problem ist aber, dass ich einfach nicht herausfinden kann, welche Knoten nun an welchen gehängt werden soll. Kann mir bitte jemand auf die Sprünge helfen ? Vielen Dank im voraus!
Im Anhang ist mein aktueller, verzweifelter Stand ... Im Kopf des Programms ist die Musterausgabe des Baumes.

Gruß
Fabian

Code:
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;

/**
 * 
 * Beispielausgabe:
 * 
 * Dateien
 * 		Musik
 * 			Rock
 * 				Abba
 *              Zappa
 *          Jazz
 *      Bilder
 *           Februar 2008
 *           März 2008
 *           April 2008   
 *               bis 15.04.
 *               ab 15.04  
 *    
 **/

public class BuildingAJTree extends JFrame {
	
   static final String [] folderPathNames = {
            "Dateien/Musik/Rock/Abba",
            "Dateien/Musik/Rock/Zappa",
            "Dateien/Musik/Jazz",
            "Dateien/Bilder/Februar 2008",
            "Dateien/Bilder/März 2008",
            "Dateien/Bilder/April 2008",
            "Dateien/Bilder/April 2008/bis 15.04.",
            "Dateien/Bilder/April 2008/ab 15.04."	             
   };

  public static void main( String[] argv ) {
    new BuildingAJTree("Simple Tree");
  }

  public BuildingAJTree(String title) {
    super( title );    
    buildTree();
    pack();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible( true );
  }

  private void buildTree() {

	//TODO build up the Tree
	  DefaultMutableTreeNode root = new DefaultMutableTreeNode("Dateien");
	  root.setParent(null);
	  
	  for (int i = 0;i<folderPathNames.length;i++) {
		  DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(folderPathNames[i]);
		  //alle einträge zwischen '/' teilen
		  String [] folders = folderPathNames[i].split("/");
		  for (String string : folders) {
			  DefaultMutableTreeNode child = new DefaultMutableTreeNode(string);			  
			  groupNode.add(child);
		}
		  root.add(groupNode);	  
		
	  }	  
	  
    JScrollPane js = new JScrollPane( new JTree(root));
    add(js);
  }
}
 

hdi

Top Contributor
Viel zu bitter :autsch: Ich saß grad über eine Stunde daran und hab auch nix gescheites
hinbekommen. Irgendwie hängt er mir die Dinge immer sonst wo rein, diese setParent() Methode
funktioniert irgendwie nicht richtig, und wenn man sich den Breitendurchlauf geben will, returned
er immer "null", obwohl Elemente drin sind... Voll der sch*** :?
 

Marco13

Top Contributor
Nur schnell hingehackt.... das "split" wird sau-oft gemacht, und könnte bei großen Hierarchien zum Bottleneck werden, aber ... hey, um die Uhrzeit... :roll:
Code:
// Recursive Function for [url]http://www.java-forum.org/de/viewtopic.php?t=82143&highlight=&sid=f94f4bae1ce91bb152edc32d5fb2b1d2[/url]

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.*;

/**
*
* Beispielausgabe:
*
* Dateien
*       Musik
*          Rock
*             Abba
*              Zappa
*          Jazz
*      Bilder
*           Februar 2008
*           März 2008
*           April 2008
*               bis 15.04.
*               ab 15.04
*
**/

public class BuildingAJTree extends JFrame {

   static final String [] folderPathNames = {
            "Dateien/Musik/Rock/Abba",
            "Dateien/Musik/Rock/Zappa",
            "Dateien/Musik/Jazz",
            "Dateien/Bilder/Februar 2008",
            "Dateien/Bilder/März 2008",
            "Dateien/Bilder/April 2008",
            "Dateien/Bilder/April 2008/bis 15.04.",
            "Dateien/Bilder/April 2008/ab 15.04."
   };

  public static void main( String[] argv ) {
    new BuildingAJTree("Simple Tree");
  }

  public BuildingAJTree(String title) {
    super( title );
    buildTree();
    pack();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible( true );
  }

  private void buildTree() {

   //TODO build up the Tree
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Dateien");
     root.setParent(null);

     HashMap<String, DefaultMutableTreeNode> map = new HashMap<String, DefaultMutableTreeNode>();
     map.put("Dateien", root);

     doIt(1, map);
     JScrollPane js = new JScrollPane( new JTree(root));
     add(js);
  }


    private void doIt(int level, Map<String, DefaultMutableTreeNode> map)
    {
        boolean finished = true;
        for (int i = 0;i<folderPathNames.length;i++)
        {
            String folders[] = folderPathNames[i].split("/");
            if (folders.length > level)
            {
                DefaultMutableTreeNode child = map.get(folders[level]);
                if (child == null)
                {
                    child = new DefaultMutableTreeNode(folders[level]);
                    map.put(folders[level], child);
                    DefaultMutableTreeNode parent = map.get(folders[level-1]);
                    parent.add(child);
                    finished = false;
                }
            }
        }
        if (!finished)
        {
            doIt(level+1, map);
        }
    }


}
 
F

Fabian85

Gast
Halleluja,

immerhin ein kleiner Trost, dass es doch nicht so leicht ist. Dennoch, ich fand das einfach viel zu schwer für einen Anfänger. :-( Jetzt muss ich erstmal die Lösung nachvollziehen, ich bin beeindruckt. Besten Dank, find ich klasse, dass ihr euch die Mühe gemacht habt
:toll:

Gruß
Fabian
 
G

Gast

Gast
Habs gestern Abend auch 20 min. versucht, ohne Erfolg. Ohne Rekursion oder Umstrukturieren des Arrays wirds schwierig. Und ich bin kein Anfänger :p
 

Ebenius

Top Contributor
Der Ansatz von Marco klappt leider nicht, wenn man solche Eingaben hat:
  • Dateien/Bilder/Gabi/Omas Geburtstag
  • Dateien/Musik/Gabi/Lieblingslieder
Ich würde sowas machen:
Code:
private static DefaultMutableTreeNode buildTreeNodes(
      String[] flat,
      String delimn) {
  final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
  for (int i = 0; i < flat.length; i++) {
    final String row = flat[i];
    final StringTokenizer tokenizer = new StringTokenizer(row, delimn);
    DefaultMutableTreeNode node = root;
    tokenizer: while (tokenizer.hasMoreTokens()) {
      final String s = tokenizer.nextToken();
      final Enumeration<?> children = node.children();
      while (children.hasMoreElements()) {
        final DefaultMutableTreeNode child =
              (DefaultMutableTreeNode) children.nextElement();
        if (s.equals(child.getUserObject())) {
          // node already exists
          node = child;
          continue tokenizer;
        }
      }

      final DefaultMutableTreeNode child = new DefaultMutableTreeNode(s);
      node.add(child);
      node = child;
    }
  }

  return (DefaultMutableTreeNode) (root.getChildCount() == 1 ? root
        .getChildAt(0) : root);
}
Aufrufen mit
Code:
buildTreeNodes(myArray, "/");
Ebenius
 

Marco13

Top Contributor
Ebenius hat gesagt.:
Der Ansatz von Marco klappt leider nicht, wenn man solche Eingaben hat:

Häch... hab' mir schon so oft vorgenommen, nach 24:00 keine Antworten mehr zu schreiben, bei denen man nachdenken muss :oops:

Ein Alternativversuch, bei dem man ggf. auch nachträglich noch Knoten in den Baum einfügen kann (schon wieder so eine Art Bijektion ???:L ) : Es gibt die "insert"-Methode, die sich ganz pragmatisch den Baum entlanghangelt, und mit der man irgendeine Ordnerstruktur in den Baum einfügen kann - ähnlich wie wenn etwas in einen RS-Baum oder eine TreeMap eingefügt wird...

Code:
    private static void doItReally(DefaultMutableTreeNode root)
    {
        for (int i = 0;i<folderPathNames.length;i++)
        {
            String folders[] = folderPathNames[i].split("/");
            insert(root, folders, 1);
        }
    }

    private static void insert(DefaultMutableTreeNode node, String folders[], int index)
    {
        if (index < folders.length)
        {
            DefaultMutableTreeNode child = null;
            for (int i=0; i<node.getChildCount(); i++)
            {
                DefaultMutableTreeNode c = (DefaultMutableTreeNode) node.getChildAt(i);
                if (c.getUserObject().equals(folders[index]))
                {
                    child = c;
                    break;
                }
            }
            if (child == null)
            {
                child = new DefaultMutableTreeNode(folders[index]);
                node.add(child);
            }
            insert(child, folders, index+1);
        }
    }

Ist jetzt aber wahrscheinlich ziemlich "äquivalent" zur Lösung von Ebenius...
 

Ebenius

Top Contributor
Ohne es geprüft zu haben, nehme ich an, dass mein Ansatz schneller ist, weil nicht rekursiv und weil ich keine regulären Ausdrücke verwende. Bin ja gespannt, wer das ausprobiert. :-D
 

Marco13

Top Contributor
Da verweise ich mal auf mehrere Dinge:
1. Rekursion ist (speziell bei dieser geringen Tiefe) kein wirklicher Hemmschuh für Performance
2. Man kann bei mir dediziert mit einer Methode neue LMNT einfügen (ja, überflüssig, vielleicht aber doch hübsch :( )
3. In der Zeit, die man braucht, um diese Ordnerstruktur einzulesen, könnte man wahrscheinlich zig-Tausend solcher JTrees erstellen....
4. Deine Signatur :wink:
 

Ebenius

Top Contributor
Alles richtig. Ging nur um die Theorie. :) Meine Signatur hat recht. :-D

BTW: Noch viel schneller geht's übrigens, wenn man vorher einfach das Array sortiert. dann fällt die ganze innere Schleife weg und man prüft nur noch gegen den Vorgänger.

Wenn ich das für mich implementieren würde, würde ich ohnehin TreeModel selber implementieren. Allerdings empfehle ich das keinem, weil ich weiß, wie lange ich für mein erstes gebraucht habe. TableModels sind dagegen trivial.

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Suche Quelltext für einen einfachen Animationsthread AWT, Swing, JavaFX & SWT 8
MiMa Reaktion auf einen SplitScreenTrenner? AWT, Swing, JavaFX & SWT 2
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
U Gibt es eine Möglichkeit statt concatenate einen anderen Befehl zu nutzen? AWT, Swing, JavaFX & SWT 9
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
Z Mit einem Button einen anderen Button Triggern AWT, Swing, JavaFX & SWT 3
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
O Soll ich einen JEditorPane verwenden ? AWT, Swing, JavaFX & SWT 5
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
J Schriftart über einen Button ändern AWT, Swing, JavaFX & SWT 1
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
P Wie lese ich einen jRadioButton aus? AWT, Swing, JavaFX & SWT 21
MaxG. Swing JMenu einen Listener Hinzufügen AWT, Swing, JavaFX & SWT 25
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
H JavaFX aus der .fxml Datei einen Konstruktor bedienen AWT, Swing, JavaFX & SWT 3
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
S Swing GANZE Row auf einen Schlag einfärben AWT, Swing, JavaFX & SWT 2
B JavaFX Wie programmiere ich hier einen "Weiter" Button? AWT, Swing, JavaFX & SWT 11
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
L Wie realisiere ich einen Controller AWT, Swing, JavaFX & SWT 1
A Slider soll einen Wert übergeben AWT, Swing, JavaFX & SWT 1
F JavaFX Erstelle einen Wald AWT, Swing, JavaFX & SWT 6
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
M JavaFX Wie füge ich zu einer WebEngine einen Flash Player hinzu AWT, Swing, JavaFX & SWT 3
G AWT Wie bekomme ich einen zeitgesteuerten robot hin? AWT, Swing, JavaFX & SWT 6
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
S Bei BoxLayout haben hinzugefügten Jpanels einen Versatz/Space AWT, Swing, JavaFX & SWT 0
D Graphics2D einen Bereich füllen AWT, Swing, JavaFX & SWT 1
T Einen Variablen Wert in einem TextField AWT, Swing, JavaFX & SWT 4
M Swing Mit Java in der GUI einen Belegungsplan einfügen AWT, Swing, JavaFX & SWT 23
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
H Swing Hintergrundbild in einen JFrame einfügen AWT, Swing, JavaFX & SWT 7
K 2D-Grafik Kontrastanpassung über einen JSlider AWT, Swing, JavaFX & SWT 2
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
A Swing JTextField durch einen JButton leeren AWT, Swing, JavaFX & SWT 15
J Swing JTable-Event für einen Select?? AWT, Swing, JavaFX & SWT 3
P Swing RadioButtons - nur einen auswählen AWT, Swing, JavaFX & SWT 3
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
J JFrame in einen JFrame anzeigen AWT, Swing, JavaFX & SWT 2
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
Madlip SWT Tree mit einen Klick alles ausklappen AWT, Swing, JavaFX & SWT 3
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
T Einen Kreis anzeigen AWT, Swing, JavaFX & SWT 14
M SWT /Jface Wann einen ColumnLabelProvider benutzen? AWT, Swing, JavaFX & SWT 2
-horn- WorldWindJava+JOGL soll einen animierten Graphen anzeigen, wie? AWT, Swing, JavaFX & SWT 4
X Einem JFrame einen Dialog als Parent setzen. Möglich? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Alles auf einen Panel Zeichnen AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Neue Farbe für einen Teilbereich einer Linie? AWT, Swing, JavaFX & SWT 8
M 3D-Grafik verschiedene Texturen auf einen Würfel mappen AWT, Swing, JavaFX & SWT 15
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
P Swing JTabbedPane mit JButton einen anderen Tab anzeigen AWT, Swing, JavaFX & SWT 9
G Mit Java einen Button wie z.B. im Opera 10.63 erzeugen AWT, Swing, JavaFX & SWT 3
F Swing Beenden eines ActionListener über einen Button AWT, Swing, JavaFX & SWT 8
M Jframe wie bekommt man bei den zeile einen header erzeugen AWT, Swing, JavaFX & SWT 2
I Swing Wie bekomme ich den Fokus für einen JPanel AWT, Swing, JavaFX & SWT 5
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
K LookAndFeel LookAndFeel nur für einen Frame? AWT, Swing, JavaFX & SWT 6
J Swing Kalender soll auf Buttondruck einen Monat weiterblättern AWT, Swing, JavaFX & SWT 7
C Ermitteln ob JComponent einen Listener besitzt AWT, Swing, JavaFX & SWT 2
B LookAndFeel für einen Komponenten AWT, Swing, JavaFX & SWT 2
T Ordner öffnen nach Klick auf einen Button AWT, Swing, JavaFX & SWT 3
C AWT Oval nur für einen bestimmten Schritt zeichnen AWT, Swing, JavaFX & SWT 5
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
T Swing Wie kann ich einen String in ein TreePath umwandeln? AWT, Swing, JavaFX & SWT 5
B Restart-Funktion für einen Updatemechanismus?????? AWT, Swing, JavaFX & SWT 4
U Swing Eingabe von JTextField in einen String übergeben. AWT, Swing, JavaFX & SWT 3
E Swing Zugriff auf Attribute eines JFrames über einen JDialog AWT, Swing, JavaFX & SWT 2
S Swing JTree in ScrollPane einen ToolTip geben AWT, Swing, JavaFX & SWT 2
C Einen JDialog aus einem JDialog aufrufen AWT, Swing, JavaFX & SWT 3
MQue gelbes Warndreieck um einen JFrame AWT, Swing, JavaFX & SWT 6
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
J Einen JSlider ähnlich wie in OO3 AWT, Swing, JavaFX & SWT 5
G Wie lasse ich einen Graphen zeichnen(mit einer ArrayList)? AWT, Swing, JavaFX & SWT 5
T 2JLabels in einen JTable Header AWT, Swing, JavaFX & SWT 2
R Ich suche einen sehr simplen. AWT, Swing, JavaFX & SWT 2
G Date in einen String umwandeln AWT, Swing, JavaFX & SWT 4
T JFileChooser: beim Save Dialog einen Dateinamen vorgeben? AWT, Swing, JavaFX & SWT 6
P Einen Komponent zweimal zu einem Panel hinzufügen? AWT, Swing, JavaFX & SWT 18
S Will einen Punkt zeichnen aber krieg das net hin. AWT, Swing, JavaFX & SWT 2
E Duch jFileChooser oä. einen Ordner Pfad angeben AWT, Swing, JavaFX & SWT 3
N Kennt jemand einen WYSIWYG Editor für AWT? AWT, Swing, JavaFX & SWT 4
I Wie mache ich einen modalen JPanel? AWT, Swing, JavaFX & SWT 2
I Listener für einen JSlider AWT, Swing, JavaFX & SWT 1
G An die Quelle einen events kommen AWT, Swing, JavaFX & SWT 2
J JTable nachträglich in einen JScrollPane einfügen AWT, Swing, JavaFX & SWT 6
S PopupMenü --> auf einen JButton zugreifen AWT, Swing, JavaFX & SWT 6
E JComboBox: einen Eintrag "unselectable" setzen AWT, Swing, JavaFX & SWT 7
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
G Farbe ändern bei Klick auf einen Kreis AWT, Swing, JavaFX & SWT 5
S Automatisches Rendern einen JPanels AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben