Grundsätzliche Fragen zur Beziehung Daten/Anzeige in Swing

mas666

Mitglied
Hallo zusammen,

Ich habe mal eine grundsätzliche Frage. Wie realisiert man eine konsistente Anzeige zu einem Datenobjekt?

Beispiel: Ich habe ein Objekt der Klasse 'House'. Dieses enthält einen Vector mit Objekten der Klasse 'Floor', diese wiederum enthält einen Vector mit Objekten der Klasse 'Room'.
Nun möchte ich eine Baumstruktur anzeigen, die diese Hierarchie wiederspiegelt. Es können Floors und Rooms hinzugefügt werden. Diese Objekte schreibe ich natürlich direkt ins Datenobjekt und möchte, dass sich die Baumstruktur automatisch aktualisiert.

Ich kenne die Funktionsweise eines Observers, habe damit auch schon einfachere Probleme gut gelöst. Trotzdem ist Swing ja genauso aufgebaut, dass Ansicht und Daten getrennt werden, so sollte Swing die Grundfunktionalität ja zur Verfügung stellen, oder?

Ich habe die Implementation dieses konkreten Problems noch nicht richtig verstanden. Im Moment durchlaufe ich bei jeder Mutation das ganze Datenobjekt (Project), was bei grossen Bäumen einfach zu lange dauert.

Dies ist der erste Teil des Problems. Der zweite ist, dass jedes Baumblatt verschiedene Dinge darstellen soll. Ein Project-Blatt zeigt die enthaltenen Floors, ein Floor-Blatt die enthaltenen Rooms. Ein Room hat eine definierte Anzahl von Kindern (z.B. Möbel, Lichter, Bilder, ...), so, dass in jedem Raum Möbel usw. erfasst werden können. Dies geschieht in Tabellenform. Das heisst, dass ich bei Klick auf ein Möbel-Blatt die Möbeltabelle des jeweiligen Raumes darstellen will. Diese Tabellen (JPanel mit Buttons für add, del, edit und eine JTable mit den Einträgen) werden auch bei jedem durchlaufen des Baumes (also nach jeder Manipulation geladen.

Versteht mich jetzt nicht falsch. Ich erwarte keinen Java-Code oder, dass ihr mein Problem löst. Ich suche Inputs zum Vorgehen, Tipps zur Implementation. Ein UML-Diagramm das ein vergleichbares Problem abbildet wäre auch schon viel.

Das ganze funktioniert (abgesehen von der Geschwindigkeit bei grossen Bäumen) auch ganz gut. Trotzdem bin ich der Meinung, dass es einfacher, sauberer gehen muss.

Herzlichen Dank im Voraus auch für Links zu guten Tuts oder erklärungen.

Gruss
mas
 
Hallo,

mal so aus dem JNähKästchen geplaudert !

JTree und TreeModel halten über den TreeModelListener in die eine Richtung und
mit valueForPathChanged in die andere Richtung den Kontakt zu einander.

Da erzähle ich aber ja sicher nix neues ...

Änderungen der übrigen GUI welche vom Status des Trees abhängen, lässt man am besten durch einen der drei Listener anstoßen !

Der TreeExpansionListener und der TreeSelectionListener sind dabei wohl die wichtigeren zwei.

Verfügt dein TreeModel also über weitere get... und set... Methoden,
(um Floors und Rooms etc. hinzu zu fügen) so muß jede dieser Methoden
die registierten TreeModelListener (und somit den zugehörigen JTree) darüber informieren.

Und der TreeSelectionListener gibt Auskunft über einen grade selektierten Eintrag,
wenn dieser dann ein "Leaf" (bei Dir also ein Room) ist kannst du deine
Einrichtungstabelle entsprechend aktualisieren.

Und nun meine Frage :

An welcher Stelle hakt es ?
Wo, wann durchsuchst du die ganze Baumstruktur ?

Gruß JAdix
 
Hallo,

Danke für Deine Antwort.

Ich benutze den TreeSelectionListener und werte dort aus, welche Node angewählt wurde. Je nach Node stelle ich verschiedene Dinge dar. Die Nodes erben von DefaultMutableTreeNode und es gibt für jeden Node-Typ eine Klasse (FloorNode, RoomNode, ...). Ich werte im TreeModelListener mit instanceof (Ja kommt, schlagt mich! und dann sagt mir wie ich es anders löse :) ) den Node-Typ aus und tätige entsprechende Aktionen.

Wo ich den Baum durchlaufe?
Du hast mir bereits einen Hinweis geliefert. Ich benutze ein DefaultTreeModel und habe kein eigenes erstellt. Somit läuft das hinzufügen eines Rooms zum Beispiel folgendermassen. Ich wähle eine Floor-Node, es wird die Option 'Add Room' dargestellt. Ich wähle diese, durchlaufe mein Projekt-Objekt, suche nach dem betreffenden Floor, füge ihm ein Room-Objekt hinzu und gebe dann das Kommando, dass sich der Baum neu aufbauen soll. Der Baum wird also quasi neu generiert.

Ich werde also ein eigenes TreeModel erstellen und dort die Datennmanipulation vornehmen, ähnlich wie ich es mit meinen Tabellen mache. Gerne komme ich für weitere Fragen auf diesen Thread zurück.

Gruss
mas
 
Hallo nochmal !

Ups, ich dachte du hättest schon ein eigenes TreeModel !
Hörte sich für mich so an !

Auch wenn ich dich nun dazu animiert habe ein eigenes Model zu implementieren,
was sicher auch nicht verkehrt ist, kann man mit den Defaultimplementationen
sicher 90% der Fälle rund um den JTree erschlagen.

Zum instanceof ist zu sagen : "So schlimm ist das gar nicht !" :)

Anstatt Ableitungen vom DefaultMutableTreeNode hätte man auch mit dem User-Objekt arbeiten
können, welches man in die DefaultNodes ablegen kann.
Je nach implementation (gemeinsame Unterklasse oder Interface) hätte man dieses
Objekt dann anders über seine Art und Beschaffenheit befragen können !

Gruß JAdix
 
Zurück