# JTree und TreeModel mit 2 Klassen



## milanwb (13. Aug 2008)

Hallo,

ich versuche grade das erste mal ein eigenes TreeModel zu schreiben.

Und zwar schreibe ich gerade eine Linkbibliothek, die die Links in Gruppen sortiert und dann nach Gruppen anzeigen soll.
Das ganze soll dann so aussehen:


#Downloads
**Gruppe1
****Download 1
****Download 2

** Gruppe2
****Download 1
****Download 2

usw...

Nun habe folgende Klassen:

Download (enthält jeweils einen Link; die Klasse speichert Namen, Link, Größe und andere Daten, wobei der Name mit .getName() ausgelesen werden kann)

Gruppen (enthält Namen und bestimmte Einstellungen ** Wichtig hierbei ist: Diese Enthält auch eine ArrayList<Download>, die alle Downloads dieser Gruppe enthält (kann mit getDownloads() geholt werden))


Nun Versuche ich mein TreeModel so zu schreiben, dass ich halt jeweil des Namen der Gruppe und dann dadrunter die Namen der Downloads angezeigt bekomme.

Meine Frage ist nun, reicht dafür ein TreeModel? Oder muss ich mehrere Erstellen die ich dann, ähnlich wie das bei den DefaultModels funktioniert ineinander schichte? (siehe Beispiel)


```
DefaultMutableTreeNode main = new DefaultMutableTreeNode("Downloadkategorien");

        for (int x =0; x < groups.size(); x++) {

            DefaultMutableTreeNode sub = new DefaultMutableTreeNode(groups.get(x));

            ArrayList<Download> daten = groups.get(x).getDownloads();

                for (int a = 0; a < daten.size(); a++) {
                    if (!daten.get(a).isEmpty()) {
                    DefaultMutableTreeNode sub2 = new DefaultMutableTreeNode(daten.get(a));
                    sub.add(sub2);
                    }
                }
            
            main.add(sub);

        }
```


Oder habe ich die Möglichkeit das in ein TreeModel zu fassen? Bisher blieb ich jedoch nicht sehr erfolgreich.
Ich habe mal daran gedacht folgendes zu basteln:


```
@Override public int getChildCount( Object parent )
  {
      if (parent instanceof Gruppen)
        return ((Gruppen)parent).getDownloads().size();

      if (parent instanceof ArrayList<?>)
        return ((ArrayList<Gruppen>)parent).size();
    return 0;
  }

  @Override public Object getChild( Object parent, int index )
  {



      if (parent instanceof Gruppen)
        return ((Gruppen)parent).getDownloads().get(index).getName();

      if (parent instanceof ArrayList<?>)
        return ((ArrayList<Gruppen>)parent).get(index).getName();


      return "nichts";

  }
```


Wie gesagt, das ist das erste Mal, dass ich mit diesem TreeModels arbeite (Vielleicht hab ich die auch noch nicht richtig verstanden).
Für Tipps bin ich gerne offen und bedanke mich schon mal im vorraus!


Viele Grüße

Michael


----------



## milanwb (14. Aug 2008)

Also ich habe meine Baum soweit fertig gestellt.

Nun hab ich noch ein weiteres Problem auf das ich keine Lösung finde.

Und zwar zeigt der JTree nun den Inhalt des Arrays als "Hauptzweig" an. ([P07-01, I07-02 usw]) (siehe Bild)








Wie muss ich mein TreeModel jetzt verändern, so dass ich dort z.B. "Download" stehen habe?
Das Anzeigeproblem bei anderen Zweigen habe ich so gelöst, dass ich meine toString() Methode bei den Klassen Gruppen und Download überschrieben habe.

Ich muss doch nicht eine eigene ArrayList Klasse schreiben, die nur toString() überschrieben hat oder?
Da wird es wohl andere Lösungen geben, ich denke ja sowieso, dass meine toString()-Lösung nicht sehr korrekt war 


Hier mal der Code meines TreeModels


```
package downloadarchiv;

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

@SuppressWarnings("unchecked")
public class DownloadModel implements TreeModel
{

    private final ArrayList<Gruppen> daten;



  public DownloadModel( ArrayList<Gruppen> daten )
  {
    this.daten = daten;
  }

  @Override public Object getRoot()
  {
    return daten;
  }

  @Override public boolean isLeaf( Object node )
  {
        return (node instanceof Download);
  }

  @Override public int getChildCount( Object parent )
  {

      if (parent instanceof Gruppen)
        return ((Gruppen)parent).getDownloads().size();

      if (parent instanceof ArrayList<?>)
        return ((ArrayList<Gruppen>)parent).size();
    return 0;
  }

  @Override public Object getChild( Object parent, int index )
  {


      if (parent instanceof Gruppen)
       return ((Gruppen)parent).getDownloads().get(index);

      if (parent instanceof ArrayList<?>)
        return ((ArrayList<Gruppen>)parent).get(index);


      return "nichts";
  }


  @Override public int getIndexOfChild( Object parent, Object child ) { return 0; }

  @Override public void removeTreeModelListener( TreeModelListener l ) { }

  @Override public void addTreeModelListener( TreeModelListener l ) {  }

  @Override public void valueForPathChanged( TreePath path, Object newValue ) { }
}
```



Danke für eure Hilfe


----------



## André Uhres (16. Aug 2008)

Dies könnte helfen: JTree - Teil 3 - Darstellung der Daten
Als Beispiel wird dort gezeigt, wie man Farben darstellt.


----------



## milanwb (16. Aug 2008)

Juhuuu 

Bin ich dämlich...
Und ich arbeite mit einem eigenen CellRenderer um Farben und Icons zu setzen und komm nicht drauf *gg*

Hehe vielen, vielen Dank!

Grüße

Michael


----------

