Swing Datenmodell in Tree spiegeln ohne Adapterklassen

  • Themenstarter Themenstarter Firephoenix
  • Beginndatum Beginndatum
F

Firephoenix

Gast
Das ist was für die JTree-Experten (zu denen ich sicherlich nicht gehöre).

Folgendes Problem habe ich aktuell:
Ich habe ein Datenmodell aus mehreren abhängigen Klassen, dieses Datenmodell kann sich automatisch ändern, oder durch den Benutzer verändert werden.
Beispiele für Änderungen (nicht mein Datenmodell, aber der Vergleich ist brauchbar):
-Ein Schüler wird manuell einer oder mehreren Klausuren zugeordnet und soll nun dort angezeigt werden.
-Ein Schüler schreibt eine Klausur, das Ergebnis wird im Baum angezeigt.

Die Daten sollen in einem (oder mehreren) Baumstrukturen angezeigt werden, denkbar wäre z.B. (um mal bei dem vorigen Beispiel zu bleiben)
-Schüler
--Klausur
---Ergebnis

-Klausur
--Schüler
---Ergebnis

usw.


Da das Datenmodell schon besteht und Adapterklassen unter anderem auch teuer sind (und schwer zu managen, ein Schüler kann z.B. mehreren Klausuren zugeordnet werden) hat sich die Lösung angeboten, ein eigenes TreeModel zu implementieren um direkt die Daten anzuzeigen.
Das Datenmodell bietet alle Abfragemöglichkeiten (Wer hat welche Kinder, ...) die ein Tree interpretieren kann. Weiterhin kann es bei Änderungen per Observer-Pattern überwacht werden.

Und genau da beißt sich die Katze in den Schwanz: Angenommen ich entferne eine Klausur, dann bekomme ich ein Event mit der Klausur zurück und weiß diese ist entfernt.
Jetzt müsste ich aber auch den Tree aktualisieren, ein TreeEvent kann ich nicht zusammenbauen, denn für den TreePath müsste ich ja das Objekt in meinem Datenmodell suchen, dort ist es aber bereits entfernt. Ich könnte also höchstens die Wurzel updaten, dann klappt mir natürlich der ganze Baum zu.

Wäre es eine Alternative mit dem Baum das Datenmodell zu pollen und ihn einfach regelmäßig neu zu zeichnen (geht das überhaupt?). Durch das Renderverfahren im JTree ist neu-zeichnen ja relativ günstig, die Abfragen im Datenmodell sind auch sehr performant.
Ich habe da an sowas gedacht wie einen seperaten Thread, der den Tree einfach alle 50-100ms neu zeichnen lässt.

Hat jemand schonmal sowas versucht, oder gibt es für das Problem eine bekannte, elegantere Lösung die ich übersehen habe?

Gruß
 
> Angenommen ich entferne eine Klausur, dann bekomme ich ein Event mit der Klausur zurück und weiß diese ist entfernt.

was genau steht an Information in dem Event? die Klausur? hat die einen Link auf den Schüler oder so?
eine gewisse Informationsdichte wäre schon nützlich, was soll sonst jedermann mit diesem Event anfangen


----

eine Überlegung wäre auch, sich im Model zu merken, welche Daten zur Anzeige verarbeitet wurden,
im Löschfall mit dem neuen Ist-Zustand vergleichen und so das fehlende Element zu finden,

kann allerdings vielleicht sehr viele Daten betreffen, wenn viel aufgeklappt ist und der JTree scrollt ohne dass im DatenModel
immer neu abgefragt wird was gerade in der GUI zu sehen ist
 
Zuletzt bearbeitet von einem Moderator:
Bei dem Event bekomme ich tatsächlich nur das gelöschte Objekt zurück (z.B. für andere Observer um gelöschte Objekte irgendwo zu archivieren), die Datenstruktur ist allerdings zu dem Zeitpunkt schon auf dem aktuellen Stand, ich habe also keine Möglichkeit mehr nachträglich herauszufinden welche Objekte das gelöschte Objekt referenzierten.

Eine Möglichkeit wäre vielleicht auch eine Änderung am Eventsystem, so dass ich mir zusätzlich zu dem Objekt Listen zurückgeben lasse von allen Objekten, die auf dieses Referenziert haben (wären 2-3 Listen im aktuellen Datenmodell), diese dann im Baum suche und dort gezielt update.

Gruß
 
In deinem JTree wird die Node des Objekts aber noch angezeigt oder? Kannst du nicht einfach alle Nodes durchlaufen und deren UserObject mit deinem Objekt vergleichen?
 
In deinem JTree wird die Node des Objekts aber noch angezeigt oder? Kannst du nicht einfach alle Nodes durchlaufen und deren UserObject mit deinem Objekt vergleichen?

Das entspricht der Lösung die ich eigentlich vermeiden wollte, da ich das bestehende Datenmodell eigentlich nicht nochmal in TreeNodes packen wollte, sondern es direkt mit einem TreeModel darstellen will.
Die Alternative werde ich aber auf alle Fälle auch mal testen, vom Aufwand her scheint es einer der leichteren Ansätze zu sein.

Gruß
 
Ja klar, eigentlich ist es schöner wenn das Model direkt auf die echten Daten zugreift. In der Realität hat man dann immer wieder mit solchen Problemen wie du zu tun. Das is z.B auch ein Grund warum man normalerweise ein Tablemodel nicht direkt die DB-Abfragen/Änderungen machen lässt sondern das ganze quasi als Puffer nutzt.
Ansonsten, kannst du dir nicht auch einfach den TreePath merken, deinen Tree neu aufbauen und dann den Treepath expanden?
 

Zurück
Oben