Announcement

Collapse
No announcement yet.

jtree

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • jtree

    Hi,

    habe weiteres refresh Problem mit dem jtree. Ich möchte wenn ich ein Knoten aktualisiere, alle knoten die sich unterhalb befinden und geöffnet waren, wieder geöffnet darstellen.

    Meine vorgehensweise:
    Ich lösche alle childs, die sich unterhalb des zu aktualisierenden Knotens befinden. Jetzt führe ich eine Methode aus die ein klick auf diesem Node durchführt und zeige alle childs an. Ich muß nun feststellen, ob ich die childs weiterhin öffnen muß hierzu brauche ich die Information ob Sie vorher geöffnet war usw. einfach mit reload() geht es leider nicht.

    Ich hoffe das Problem richtig erklärt zu haben. Es geht letzendlich darum den aktuellen Zustand des Knotens mit den neuen Daten anzuzeigen und dabei alle vorher geöffneten knoten auch wieder geöffnet darzustellen.

    vielleicht kann mir da jemand hilfestellung geben

    gruß
    Orhan

  • #2
    Intuitiv wuerd ich sagen: Einen TreePath des aktuellen Baums merken, und zwar anhand der Attribute, die sich NICHT aendern (z.B. IDs) - z.B. ein Vector von IDs der geoeffneten Baumknoten, wenn Du sowas wie IDs im Baumknoten hast. Dann den Baum komplett erneuern, und danach all die Knoten, die vorher offen waren, wieder aufklappen, indem Du den Vector in der anderen Richtung abarbeitest.<p>
    Mir will nicht so recht in den Kopf, was fuer Aenderungen das sein sollen, die es erfordern, dass Du einen Sub-Tree komplett loescht, um ihn komplett wieder zu restaurieren. Wenn Du nur die sich geaenderten Teile neu darstellst, solltest Du doch viel schneller sein.<p>
    Falls es um das letzte Problem geht, dass Du aus irgendeinem Grund einen Knoten zwischendurch als Blatt sehen willst und sozusagen ALLE Childs erst wegnimmst, um sie danach wieder zu restaurieren, wuerd ich die gesamte Child-Struktur "temporaer umhaengen" auf einen TreeNode, der NICHT im Baum eingehaengt ist, also einen Teilbaum "unmounten" und spaeter wieder "mounten".<p>
    Gruss, Marc

    Comment


    • #3
      Hmm... Wenn du das ganze als Event aus dem Model heraus absetzt, geht es einfacher. Dort kannst du mittels den Methoden fireTreeNodesChanged(), fireTreeNodesInserted(), fireTreeNodesRemoved(), fireTreeStructureChanged() - und den entsprechend korrekten PArametern - aus dem Modell heraus veranlassen, dass sich Teile des Trees updaten. Mit dem richtigen Event gibst du dem Swing-Control vor, welche Tätigkeiten nötig sind. Habe es selbst schon verwendet und ausser dem nicht ganz einfachen Parameter-Aufbau läuft es einwandfrei.

      cia

      Comment


      • #4
        Noch eine Möglichkeit:
        //rootPath wird benötigt um den Baum später wieder aufzuklappen (root ist ein DefaultMutableTreeNode)
        rootPath = new TreePath(root.getPath());

        //Merken welche Knoten offen sind
        expandedPaths = this.getExpandedDescendants(rootPath);

        //Baum wieder öffnen so wie er am Anfang war
        while(expandedPaths.hasMoreElements())
        {
        this.expandPath((TreePath)expandedPaths.nextElemen t());
        }

        Gruss, Violet

        Comment

        Working...
        X