JTree: Status des Baums speichern?

Status
Nicht offen für weitere Antworten.

AlArenal

Top Contributor
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?
 
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 )").
 
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 😉
 
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.
 
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 😉
 
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)???
 
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:
Code:
        jTree.expandPath(treePath);
 
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).
 
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.
 
Von den Änderungen bekomme ich im JTree aber herzlich wenig mit, weil die in JTree.TreeModelHandler abgefrühstückt werden....
 
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?
 
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....
 
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 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben