Hallo,
ich habe mir eine Art Windows-Explorer gebaut. Ich möchte nun wie im richtigen Explorer die Möglichkeit haben in einem zweiten Fenster nochmals eine Baumstruktur d.h den eigenen Explorer anzuzeigen. Ich hätte also in diesem Moment zweimal das Explorerdialogfenster mit gleichem Inhalt offen.
Wenn ich nun in dem einen Fenster im Baum etwas ändere z.B. umbenennen eines Knotens soll die natürlich auch mit ersten Fenster erfolgen.
Wie stellt man diese Verbindung / Kommunikation her ?
Mein Ansatz war folgender:
Für das TreeModel habe ich eine eigene Klasse von DefaultTreeModel abgeleitet.
Beide Fenster bzw. Bäume verwenden das gleiche TreeModel. Somit muß immer nur ein TreeModel gepflegt werden. Ist es nun ausreichend wenn ich das TreeModel in einem der Fenster mit model.reload() neu aufbaue oder muß ich die Fenster irgendwie über einen Listener verbinden ? Wie ?
Danke
Albert
Moin
Für das TreeModel habe ich eine eigene Klasse von
DefaultTreeModel abgeleitet.
Dann hast du sicher auch die Methoden: fireTreeNodesChanged, fireTreeNodesInserted, … (alles was mit fire anfängt) gesehen.
Beide Fenster bzw. Bäume verwenden das gleiche TreeModel.
Nach dem ändern im gemeinsamen Modell die entsprechende Metode aufrufen. Die Bäume ändern sich dann von selbst. (evtl mit einem repaint nachhelfen wenn sie in einem JScrollPane stecken, hängt von GUI-editor und der java-version ab)
(Sie registieren beim setModell() oder erstellen von selbst TreeModellListener die in den fire-Methoden mit aufgerufen werden)
cu
Korrektur …
Moin
hab mich geirrt, ich meinte nicht die fire-Methoden, sondern die nodeChanged, nodesChanged, … nodesWereRemoved-Methoden. Prinzip bleibt aber das gleiche. Man änder die Daten und informiert das Modell. Alles weitere läuft automatisch.
cu
Danke für die Hilfe.
Die Kommunikation funktioniert auch einigermaßen.
Ich habe dem Model einen TreeModelListener zugewiesen. Der Listener selbst ist der Baum. Wenn sich also im Model etwas ändert wird der Baum informiert. Im Baum wird dann in der entspr. „fire-Methode“ das Model mit reload neu aufgebaut. Die Bäume in den Fenstern werden auch aktuallisiert. Allerdings sind sie danach nicht mehr aufgeklappt. Um sie wieder zu öffnen mekre ich mir mit der Tree-Methode „getExpandedDescendants“ wie der Baum aussah und versuche in der „Fire-Methode“ dann den Baum wieder zu öffnen. Dies funktioniert aber nur teilweise. In dem Fenster das zum Zeitpunkt der Aktion den Focus hatte also das Fenster in dem ich z.B: den Knoten im Baum gelöscht habe wird der Baum auch wieder geöffnet. In dem anderen Fenster nicht. Für beide Bäume wird aber definitiv meine expandtTree Methode durchlaufen.
Hast Du eine Idee ?
Der Baum sitzt auf einem ScrollPane und dieses in einem SplitPane.
Danke
Albert
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Moin
Die
Bäume in den Fenstern werden auch aktuallisiert. Allerdings
sind sie danach nicht mehr aufgeklappt.
Einerseits dürften sie das gar nicht tun (DefaultTreeModel.nodesWereInserted(TreeNode node,int[] childIndices) löst z.B. kein Zusammenfalten aus, DefaultTreeModel.reload muss man da auch nicht aufrufen) andererseits kann man das ganze auch verhindern: einen TreeWillExpandListener implementieren der beim Aufruf von treeWillCollapse eine „ExpandVetoException“ schmeisst.
cu