Sortierung JTree DefaultMutableTreeNode

jimb0p

Erfahrenes Mitglied
Hallo Zusammen,

ich habe im Moment das Problem, dass ich noch über die Herangehensweise nachdenke. Ich hole mir aus der Datenbank alle Kategorien die es gibt. Jede Kategorie kann jeweils eine Unterkategorie haben und zwar beliebig viele. Ich hole die Ergebnisse mit drei ArrayListen ab. Spalte eins ist der Primärschlüssel der Kategorie, Zweite Spalte der Name der Kategorie und dritte Spalte ist der Wert der Oberkategorie (also welchem Primärschlüssel diese Kategorie zugeordnet ist.). Wie genau gehe ich es jetzt an um diese Liste so zu sortieren, dass ich sie in einen JTree reinbekomme? Kurzen Auszug:

1 | Root | 0
2 | Kategorie 1 | 1
14 | Kategorie 2 | 1
19 | Kategorie 3 | 1
5 | Unterkategorie 1 | 2
4 | Unterkategorie 2 | 2
128 | Unterkategorie 3 | 2
usw.

Freue mich über jeden Tipp. Möchte Schlussendlich an die GUI ein DefaultMutableTreeNode übergeben, wo es dann an den JTree übergeben wird, oder ist das falsch gedacht?

Gruß
 
du baust eine rekursive methode, der du ein Objekt mitgibst.
zuerst das Objekt *root*.

dieses Objekt fragst du nach seiner ID.
Mit dieser ID gehst du auf die Suche nach allen Objekten, die als parent diese ID haben.

Das gleiche Spiel dann mit den jedem der jeweils gefundenen Objekten.
Solange bis alle Objekte abgearbeitet sind.

Klar, zwischendurch musst du die Knoten erstellen (DefaultMutableTreeNode) und diese dann auch
beim rekursiven Aufruf mitgeben.
Damit die Kinder wissen an wen sie sich klammen müssen.

Also, das wäre so der Kindergarten weg..
Es gibt dafür aber bestimmt noch bessere Lösungen.
 
Zuletzt bearbeitet:
Danke für deine Antwort. Komme aktuell nicht weiter, habe irgendwie einen Denkfehler. Hier mein bisheriger Code:

Java:
public DefaultMutableTreeNode createCategorieModel(Kategorien kategorien, int parent, DefaultMutableTreeNode node){
		if(kategorien.kKategorie.size() == 0){
			return(node);
		}
		int min = Collections.min(kategorien.kOberKategorie);
		if(min == 0){//dann ist es root
			for(int i = 0; i < kategorien.kOberKategorie.size(); i++){
				if(kategorien.kOberKategorie.get(i) == min){
					node = new DefaultMutableTreeNode(kategorien.cName.get(i));
					kategorien.cName.remove(i);
					parent = kategorien.kKategorie.get(i);
					kategorien.kKategorie.remove(i);
					kategorien.kOberKategorie.remove(i);
					createCategorieModel(kategorien, parent, node);
				}
			}
		}else{
			for(int i = 0; i < kategorien.kOberKategorie.size(); i++){
				if(kategorien.kOberKategorie.get(i) == parent){
					
				}
			}
		}
		return(createCategorieModel(kategorien, parent, node));
	}

Wie sieht es aus wenn beliebig viele Kategorien noch folgen können? kKategorie ist der Primärschlüssel, kOberkategorie ist die Kategorie die der Punkt zugeordnet ist und cName ist einfach der Name der Kategorie, als String.
 
Irgendwie so...
(ist jetzt absolut ungetestet!! aber so in etwa schematisch)

(INFO: wenn der Baum *RIESENGROß* ist, ist Rekursion vermutlich nicht die beste Wahl!)
Java:
public static void main(String[] args)
{
   List<Kategorie> kategList = getList(...);
   Kategorie rootKateg = getRootKategFromList(kategList);
   DefaultMutableTreeNode rootNode = new DefaultMulatbleTreeNode(root);
   DefaultTreeModel dtm = new DefaultTreeModel(createCategorieModel(rootNode,kategList));
   jTree.setModel(dtm);
}


public static DefaultMutableTreeNode createCategorieModel(DefaultMutableTreeNode parentNode, List<Kategorie> kategList)
{
   Kategorie parentKateg = (Kategorie)parentNode.getObject();        
   int id = parentKateg.getId();
   for (Kategorie k : kategList)
   {
      if (k.getParentId() == id)
      {
          parentNode.add(createCategorieModel(new DefaultMutableTreeNode(k), kategList));
      }
   }
   return parentNode;
}

[EDIT]

Wie sieht es aus wenn beliebig viele Kategorien noch folgen können?
Wie meinst du das?
Willst du Knoten im fertigen Baum hinzufügen?
Das ist auch kein Problem.

Du kannst den Baum auch erst bei OnTreeNodeExpand() bauen.
Bei einem OnTreeNodeExpand() ermittelst du die Kinder und hängst diese der Node hinzu.
 
Zuletzt bearbeitet:
Hi Danke für deine Hilfe,

was genau bedeutet hier root:
Java:
DefaultMutableTreeNode rootNode = new DefaultMulatbleTreeNode(root);

[EDIT]
Ok du meinst hier sicherlich rootKateg, aber wie bekomme ich dann die Benennung korrekt hin, weil aktuell stehen nur Adressen im Tree.

[EDIT 2]
Habe es wie folgt gemacht:
Java:
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(root.cName);
DefaultTreeModel dtm = new DefaultTreeModel(createCategorieModel(rootNode, kategList, root));

Und dann entsprechend die Funktion noch angepasst. Jetzt stehen die Werte korrekt da. Vielen Dank!
 
Zuletzt bearbeitet:
Habe nun aber leider ein anderes Problem :( Ich nutze jetzt CheckBoxTree damit ich mehrere auswählen und mir anschließend ausgeben kann welche ausgewählt wurden. Jedoch kann es sein das ein Unterpunkt irgendwo anders nochmal auftaucht, also sie sind nicht eindeutig benannt. Kann ich irgendwie noch IDs hinterlegen in dem DefaultTreeModel, damit ich eine eindeutige Zuweisung hinbekomme?
 
Zurück