2010-09-29 8 views
8

Ich habe einen JTree in meiner GUI verwendet und es zu einem JFrame hinzugefügt. Wenn ich es aktualisieren und seine Knoten in einem anderen Teil meines Programms ändern möchte (während das Programm läuft, während eine Aktion ausgeführt wird), versuche ich neue Knoten hinzuzufügen oder Knoten zu entfernen; Aber meine Schnittstelle ändert sich nicht. Bitte schlage mir eine Lösung vor.Aktualisierung von JTree in Java GUI

Grüße

Antwort

15

Neben dem insertNodeInto Vorschlag können Sie auch:

DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); 
root.add(new DefaultMutableTreeNode("another_child")); 
model.reload(root); 
+1

Also danke für deine würdige Antwort! Jedes Mal wenn ich meinen Baum aktualisieren möchte, benutze ich diese Methode. – sajad

+3

Dies wird funktionieren, ist aber ein "Brute-Force" -Ansatz im Umgang mit großen Bäumen. Wenn ich zum Beispiel 1000 Knoten zu einem Baum verschmelzen und hinzufügen würde, der bereits 50.000 Elemente enthält, wäre dies sehr ineffizient. – Adamski

+1

In der Wildnis, wie oft wird der Baum groß genug, dass dies langsam genug wird, um sich Sorgen zu machen? –

2

Sie müssen Sie es, um sicherzustellen, dass Ihr Modell nach dem Update anweisen, ein Ereignis zu feuern alle registrierten Listener, um zu bewirken benachrichtigt der Veranstaltung werden. Einer der Zuhörer wird der JTree sein und nach dem Empfang des Ereignisses wird es neu streichen.

Zum Beispiel enthält DefaultTreeModel die Methoden:

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

Auch, wie bei allen Swing-Programmierung Sie Sie aktualisieren Ihr Modell auf der Event Dispatch, um sicherzustellen, müssen Gewinde.

+1

Sie müssen diese Ereignisse nicht selbst absetzen. Sie müssen lediglich das Modell aktualisieren, indem Sie beispielsweise die Methode 'insertNodeInto' aufrufen und das Modell veranlassen, Ereignisse für die TreeModelListeners auszulösen. – dogbane

+1

Guter Punkt, obwohl es in einigen Fällen besser wäre, es selbst zu verwalten. Wenn ich zum Beispiel 1000 Kindknoten hinzufügen möchte, möchte ich keine 1000 "Knoten wurden hinzugefügt" -Ereignisse auslösen. – Adamski

+0

Danke Sir! Aber diese Methoden, die Sie erwähnt haben, sind privat und konnten nicht aufgerufen werden. – sajad

-1

Meinen Sie die GUI Aspekt ist einfach nicht Ihre Änderung zeigt? Sie sollten wahrscheinlich int repaint() und revalidate().

Here's eine gute Beschreibung, wann, welche zu nennen.

+0

Ja Aufruf dieser Methode ist notwendig. – sajad

+4

-1, Kein repaint() und revalidate() sind nicht notwendig. Wenn Sie das Modell aktualisieren, ist das Modell dafür verantwortlich, die Ansicht der Änderung zu melden, damit sich der Baum selbst neu streichen kann. – camickr