# JTree: Status des Baums speichern?



## AlArenal (25. Feb 2005)

Wie kann ich am einfachsten speichern, wie ein JTree gerade aussieht, sprich welche Äste aufgeklappt sind und welche nicht, so dass ich dieses Zustand beliebig wiederherstellen kann?


----------



## L-ectron-X (25. Feb 2005)

Mit Objektserialisierung?


----------



## Beni (25. Feb 2005)

Und wenn du (wie ich) der Serialisierung kritisch gegenüberstehst: die TreePaths zu den geöffneten Ästen suchen, und als Indices speichern (ich meine das so: um den Knoten Child vom Knoten Parent anzugeben, speicherst du "getChildIndexOf( parent, child )").


----------



## AlArenal (25. Feb 2005)

Hm...

Also im Grunde den Tree Zeile für Zeile durchgehen und wenn isExpanded(int row) true liefert, den TreePath für die Zeile z.B. zu einem Vector hinzufügen. Zur Wiederherstellung einfach den Baum komplett collapsen und dann den Vector durchgehen und die TreePaths expandieren?

Liest sich vielversprechend


----------



## L-ectron-X (25. Feb 2005)

Jo, und den Vector dann serialisieren. :wink: 
Ich finde Serialisierung ist eine einfache und elegante Art Objekte zu sichern.

Achso, ehe ich es vergesse: Statt Vector kannst Du auch ArrayList verwenden, wenn Du nichts mit Threads vor hast.


----------



## AlArenal (25. Feb 2005)

Das Serialisieren behalte ich mal im Hinterkopf, weil ich den Zustand des Trees nicht wirklich speichern muss. Ich brauche ihn nur während das Programm läuft zur Restaurierung, weil immer wenn ich wenn ein Node neu hinzukommt klappen bei mir die Trees komplett ein. 

Das ist etwas nervig für den Benutzer, würde ich mal vermuten


----------



## AlArenal (28. Feb 2005)

Mein Problem besteht noch immer. Das Problem ist, dass der JTree selbstständig alles zuklappt wenn sich im Model was ändert. Darum will ich ja den Status speichern und nach der Änderung des Jtree wiederherstellen.

Problem: Ich komme nicht "dazwischen"!

Wenn das Model z.B. einen fireTreeNodesInserted() macht, dann ackert im JTree  der JTree.TreeModelHandler. Der ist dummerweise protected. Okay denk ich mir, dann machen wir das über einen TreeWillExpandListener in dessen treeWillCollapse(). Dumm gelaufen, denn die wird nur aufgerufen wenn ich im JTree klicke, aber nicht wenn der JTree auf TreeModelEvents reagiert.

Wie bekomme ich es nun hin, dass sich im TreeModel ändern kann was will und im JTree danach dennoch dieselben Nodes expanded sind (sofern sie noch immer im Model vorhanden sind)???


----------



## Wildcard (28. Feb 2005)

AlArenal hat gesagt.:
			
		

> Wie bekomme ich es nun hin, dass sich im TreeModel ändern kann was will und im JTree danach dennoch dieselben Nodes expanded sind (sofern sie noch immer im Model vorhanden sind)???


Das geht glaub ich nicht. Man muss (IMHO) die Nodes nach der Veränderung wieder expanden:

```
jTree.expandPath(treePath);
```


----------



## AlArenal (28. Feb 2005)

Soweit war ich ja schon. Dazu muss ich aber doch direkt *vor* der Änderung zwischenspeichern welche Paths alle expanded waren. expandPath() oder expandRow() zu überschreiben bringt auch nichts. Die benutzt der JTree jedenfalls nicht, wenn er auf nen TreeModelEvent reagiert (zumindest nicht meine überschriebenen Versionen).


----------



## Wildcard (28. Feb 2005)

AlArenal hat gesagt.:
			
		

> Soweit war ich ja schon. Dazu muss ich aber doch direkt vor der Änderung zwischenspeichern welche Paths alle expanded waren.


Nicht direkt davor. Du speicherst dir immer den aktuellen Zustand und reagierst auf Änderungen.


----------



## AlArenal (28. Feb 2005)

Von den Änderungen bekomme ich im JTree aber herzlich wenig mit, weil die in JTree.TreeModelHandler abgefrühstückt werden....


----------



## Wildcard (28. Feb 2005)

Was hindert dich noch einen eigenen TreeModelListener zu verwenden?


----------



## AlArenal (28. Feb 2005)

Wildcard hat gesagt.:
			
		

> Was hindert dich noch einen eigenen TreeModelListener zu verwenden?



Lass mich da mal drüber meditieren, wenn ich die Kanne Kaffee verarbeitet und meinen Blutzuckerspiegel unter Kontrolle gebracht habe


----------



## Wildcard (28. Feb 2005)

Wenn ich da so drüber nachdenke...
Bei nodesWereInserted() sollte doch eigentlich nur der Parent Collapsed werden?
Reicht doch dann diesen einen wieder zu expanden?


----------



## AlArenal (28. Feb 2005)

Nein, bei mir wird leider alles eingeklappt, bis auf den Root-Node, der ausgeklappt ist. 

So viel Aufwand für sowas banales.. naja.. code once, use everywhere....


----------



## MiDniGG (8. Nov 2007)

Hi,

*malextremausgrab*

is zwar schon "etwas" älter aber hier ist immernoch keine Lösung...

Hat die nun jemand? Bzw., dass ich den aktuellen Tree-Status beim schließen speicher... Wenn ich was hinzufüg hab ich das Problem nicht... Nur eben beim wieder öffnen...

(Hoffe es stört nicht, dass ich hier ein 2 Jahre altes Thema wieder aufleben lasse... Hab leider nichts anderes gefunden...)

Greetz


----------

