Objekte aus JTree-Knoten in JComboBox speichern

Vicus

Grünschnabel
Guten Morgen,

ich stehe gerade vor folgendem Problem. Ich habe einen JTree in welchem ich diverse Knoten habe die Kategorien darstellen. Zusammenbauen tue ich den Tree in dem ich einen Root-Knoten erstelle, und zwei Unterknoten (Einnahmen/Ausgaben).

Knoten füge ich grundsätzlich so hinzu:
Java:
KnotenEinnahmen.add(new DefaultMutableTreeNode( MeinObjekt) );

Jetzt möchte ich ein einem späteren Schritt für die ComboBox alle "MeinObjekt" auslesen welche aktuell in dem JTree gespeichert sind.

Die API scheint mir da keine Hilfe zu sein. Daher hoffe ich auf einen Denkanstoß von euch... :)
 

Fabio Hellmann

Erfahrenes Mitglied
Hi,
ich hab einen rekursiven Iterator für einen JTreeModel geschrieben, welcher alle Objecte aus einem JTree in einem Set<Object> zurück gibt. ;)
Java:
	public static Set<Object> getObjects(final TreeModel model) {
		final Set<Object> allObjects = new HashSet<Object>();
		if(model != null) {
			final MutableTreeNode root = (MutableTreeNode) model.getRoot();
			recursiveObjectIterator(allObjects, root);
		}
		return allObjects;
	}
	
	private static void recursiveObjectIterator(final Set<Object> cache, final MutableTreeNode node) {
		final Enumeration<?> enumeration = node.children();
		while(enumeration.hasMoreElements()) {
			final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) enumeration
					.nextElement();
			if(treeNode.isLeaf()) {
				cache.add(treeNode.getUserObject());
			} else {
				recursiveObjectIterator(cache, treeNode);
			}
		}
	}

Gruß

Fabio
 

Vicus

Grünschnabel
Vielen Dank dafür. Deine Methode funktioniert soweit sehr gut. Ich habe anstatt mit Objekt direkt mit "MeinObjekt" gearbeitet.

Wenn ich dieses Set jetzt in ein Array wandeln möchte

Java:
(Kategorie[])  xSet.torArray();

bekomme ich folgende Excpetion:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcommon.data.Kategorie;

Da ich deine Method so umgeschrieben habe, dass sie ein Set mit "MeinObjekt" zurückliefert, müsste der Cast doch funktionieren!?

EDIT: Hier mein Methodenaufruf:

Java:
AbstractSet<Kategorie> xSetKategorien = (AbstractSet<Kategorie>) getObjects( xTreeModel );
Kategorie[] xArrayKnoten = (Kategorie[]) xSetKategorien.toArray();
 
Zuletzt bearbeitet:

Fabio Hellmann

Erfahrenes Mitglied
Naja, das hängt davon ab, ob du Kategorie von MeinObjekt ableitest - oder umgekehrt - oder eben nicht. Wenn nicht, dann wird es nicht funktionieren, da der Compiler das Objekt 'MeinObjekt' nicht in ein Objekt 'Kategorie' umwandeln kann.

Was genau willst du denn machen? Dann könnte ich dir evtl. dabei helfen.
 

Vicus

Grünschnabel
Sorry für die Verwirrung. MeinObjekt ist Kategorie.

Aber dann will ich es mal von vorne aufrollen ;) Ich habe folgende Oberfläche:
subframe.PNG

Jeder Knoten/Blatt ist eine Kategorie. Wenn jetzt eine neue Kategorie erfasst wird, soll über die ComboBox (rechts) die Oberkategorie festgelegt werden.

Mein Grundproblem besteht darin den neuen Knoten unter den entsprechenden Elternknoten zu kriegen. Das Problem rührt daher, dass auch ohne anklicken (TreeSelectionListener) des Elternknotens, nur über die Eingabefelder unten neue Knoten(Kategorien) einfügen möchte. Zur Zeit stehen in der ComboBox die Kategorien. Im Listener des OK-Buttons komm ich über die Kategorien die in der ComboBox liegen nicht an den Elternknoten heran. Daher meine Überlegung einfach direkt die Konten in die ComboBox zu legen.

Ich hoffe es ist damit verständlich gewurden, falls nicht frag nach und ich ergänze es :)