# JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems)



## Sagattarii (22. Jun 2009)

Servus,

also ich stehe vor einem größeren Problem. Ich hab bestimmte Daten und möchte diese automatisch in ein JTree einfügen lassen.
Ich habe eine Klasse "Kataloge" (Catalogs) in der es eine Liste mit Katalogen (Catalog) gibt. Jeder Katalog hat mehrere Aspekte (Aspect). Jeder Aspekt hat 4 verschiedene Eigenschaften (einfache Strings), darunter auch die Kategorie.
Nun soll in den Baum alle Kataloge eingefügt werden (1. Ebene). Den Grundknoten nenne ich einfach mal "Alle Kataloge". Und nun sollen alle Aspekte der jeweiligen Kataloge in den Baum eingeordnet werden, aber nicht gleich in die 2. Ebene, sondern in die 3. Ebene. Die 2. Ebene soll aus der Kategorie der Aspekte bestehen. Dabei sollen einfach alle Aspekte die die gleiche Kategorie (den gleichen cateogory String) haben an einem Knoten hängen der so heißt wie Ihre Kategorie.
Damit das Ganze etwas verständlicher wird hier der gesamte Sourcecode (alternativ kann man das ganze als Java Projekt am Ende es Posts runterladen).
Ich habe leider überhaupt kein Ansatz wie ich das MyTreeModel verändern sollte, ich lade beim erstellen des Models die (statisch erzeugten) Daten aus der Main Klasse. Jetzt hab ich die Daten, aber die muss ich ja jetzt einfügen ^^ Wie fang ich da an?

*Main.java*

```
package jtreetesting;

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import jtreetesting.app.model.Aspect;
import jtreetesting.app.model.Catalog;
import jtreetesting.app.model.Catalogs;
import jtreetesting.app.model.MyTreeModel;

/**
 *
 * @author Sagattarii
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Alle Kataloge");
        JTree tree = new JTree(new MyTreeModel(root));
        JScrollPane scrollPane = new JScrollPane(tree);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public static Catalogs getCatalogs() {
                // Wir generieren ein paar Daten
        Aspect aspect1a = new Aspect("1", "Bücher", "Herr der Ringe", "Ein tolles Buch!");
        Aspect aspect1b = new Aspect("2", "Bücher", "Der kleine Hobbit", "Auch ein tolles Buch!");
        Aspect aspect1c = new Aspect("3", "Filme", "Matrix", "Der Film zum Buch");
        Aspect aspect1d = new Aspect("4", "CDs", "RocknRoll", "");
        Aspect aspect1e = new Aspect("5", "CDs", "BritPop", "");
        Aspect aspect1f = new Aspect("6", "Bücher", "Die Entdeckung der Welt", "Ein tolles Buch!");
        Aspect aspect2a = new Aspect("1", "Filme", "Star Wars", "");
        Aspect aspect2b = new Aspect("2", "Filme", "2001", "");
        Aspect aspect2c = new Aspect("3", "Bücher", "Java for Beginners", "Gutes Java Buch");

        // Liste für 1. Catalog
        List<Aspect> aspects1 = new ArrayList<Aspect>();
        aspects1.add(aspect1a);
        aspects1.add(aspect1b);
        aspects1.add(aspect1c);
        aspects1.add(aspect1d);
        aspects1.add(aspect1e);
        aspects1.add(aspect1f);

        // Liste für 2. Catalog
        List<Aspect> aspects2 = new ArrayList<Aspect>();
        aspects2.add(aspect2a);
        aspects1.add(aspect2b);
        aspects1.add(aspect2c);

        Catalog catalog1 = new Catalog("Großer Katalog", aspects1);
        Catalog catalog2 = new Catalog("Kleinerer Katalog", aspects2);

        List<Catalog> catalogsList = new ArrayList<Catalog>();
        catalogsList.add(catalog1);
        catalogsList.add(catalog2);
        Catalogs catalogs = new Catalogs(catalogsList);
        return catalogs;
    }
}
```
*
Catalogs.java*

```
package jtreetesting.app.model;

import java.util.List;

/**
 *
 * @author Sagattarii
 */
public class Catalogs {

    protected List<Catalog> catalogs;

    public Catalogs(List<Catalog> catalogs) {
        this.catalogs = catalogs;
    }

    public List<Catalog> getCatalogs() {
        return catalogs;
    }
}
```

*Catalog.java*

```
package jtreetesting.app.model;

import java.util.List;

/**
 *
 * @author Sagattarii
 */
public class Catalog {
    protected String description;
    protected List<Aspect> aspects;

    public Catalog(String description, List<Aspect> aspects) {
        this.description = description;
        this.aspects = aspects;
    }

    public String getDescription() {
        return description;
    }

    public List<Aspect> getAspects() {
        return aspects;
    }
}
```

*Aspect.java*

```
package jtreetesting.app.model;

/**
 *
 * @author Sagattarii
 */
public class Aspect {
    protected String id;
    protected String category;
    protected String directive;
    protected String description;

    public Aspect(String id, String category, String directive, String description) {
        this.id = id;
        this.category = category;
        this.directive = directive;
        this.description = description;
    }

    public String getId() {
        return id;
    }

    public String getCategory() {
        return category;
    }

    public String getDirective() {
        return directive;
    }

    public String getDescription() {
        return description;
    }
}
```


```
package jtreetesting.app.model;

import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import jtreetesting.Main;

/**
 *
 * @author Sagattarii
 */
public class MyTreeModel extends DefaultTreeModel {

    Catalogs catalogs;

    public MyTreeModel(TreeNode root) {
        super(root);
        catalogs = Main.getCatalogs();
    }
}
```


----------



## SlaterB (22. Jun 2009)

soviel Doku kann einen auch erschlagen,
wieso fängst du nicht eine Stufe einfacher an, mit zwei Strings "a" und "b", die du in ein TreeModel einfügen willst,
klappt das soweit?
schau dir im Tutorial an, wie man TreeNodes erzeugt und an andere TreeNodes anfügt
How to Use Trees (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)

wenn das Grundprinzp bekannt ist, dann Stufe um Stufe umsetzen,
dafür braucht es z.B. for-Schleife über alle Catalogs, dann über alle Aspekte darin usw.,
fang erst mal mit den Katalogen an


----------



## André Uhres (23. Jun 2009)

Überschreib auch mal bei Catalog und Aspect die Methode Object#toString() und gibt die description, respektiv directive zurück.
Wenn die die Collections so definierst:

```
List<Catalog> catalogs = Main.getCatalogs().getCatalogs();
List<Aspect> listAspects;
TreeSet<String> categories = new TreeSet<String>();
```
dann kannst du sie einfacher durchlaufen. Beispiel:

```
for (Catalog catalog : catalogs) {
        nodeCatalog = new DefaultMutableTreeNode(catalog);
        insertNodeInto(nodeCatalog, root, root.getChildCount());
        listAspects = catalog.getAspects();
        //collect categories:
        for (Aspect aspect : listAspects) {
            categorie = aspect.getCategory();
            categories.add(categorie);
        }
        //insert categories:
...
```


----------

