Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren

scar

Mitglied
Hallo zusammen,

ich benutze die JTable mit dem RowSorter und der Möglichkeit Filter ein und aus zu schalten, funktioniert auch alles wunderbar, bis auf die Situation, dass ich Probleme habe, wenn sich das Model bei eingeschaltetem Filter ändert.
Das Model (abgeleitet vom DefaultTableModel) wird von einem Server notifiziert, wenn sich dort die Daten ändern. Wenn die gefilterten Einträge nicht betroffen sind ist alles gut. Aber wenn sich z.B. ein Wert ändert, der dann nicht mehr zum Filter passt, fliegt mir die Tabelle um die Ohren.

Bisher bin ich hingegangen und hab mir bei einem Update des Models den Filter und die Selektion der Table gemerkt, den Filter ausgeschaltet das Tableupdate durchgeführt und den Filter dann wieder eingeschaltet und die Selektion soweit wie möglich wieder hergestellt, was je nach Größe der Tabelle nicht sehr schön war, da es ganz schön geflackert hat.

Gibt es hier eine andere Vorgehensweise, die man wählen sollte, wenn man damit rechnen muss, dass sich das Filterergebnis bei einem Modelupdate ändert. Wie synchronisiert man sowas am besten in einem multithreaded Client? Gibt es evtl. extra Listener oder abstrakte Methoden für dieses Problem, die ich leider noch nicht entdeckt habe.

Gruß
Arno
 
hast du ein vollständiges Testprogramm, ohne Server, mit Dummy-Daten, mit Dummy-Änderung automatisch nach x-Sec oder Button,
mit möglichst kurzen Model, z.B. nur eine Spalte, in dem der Fehler reproduzierbar auftritt?

was für ein Fehler überhaupt konkret?

bekannt, dass jede GUI-relevant Datenänderung zur Sicherheit in SwingUtilities.invokeLater() oder vielleicht SwingWorker ausgeführt werden sollte?

das sekundenlange Laden + Vorbereiten der Daten nebenläufig, die ms des Einfügens oder auch nur einfachen Umschaltens/ Austauschens zwischen zwei großen Datenbeständen kontrolliert, damit nicht der AWT Event-Thread mitten in einer Bearbeitung erwischt wird
 
Das mit dem 'invoke later' hab ich schon mal gesehen, aber mir fehlt da der Zusammenhang, könnte aber auch eine Ursache sein, weil ich die Notifications, die vom Server kommen nicht beeinflussen kann und es im Multiuserbetrieb sicherlich Situationen gibt, wo Änderungen reinkommen, während die vorherigen Änderung noch bearbeitet wird.
Was wird den da verzögert aufgerufen und wie sag ich es welchem Listener?

Ein abgespecktes Beispiel ist für mich sehr schwierig zu erstellen, da es nicht so einfach möglich ist den Teil aus einer doch komplexeren Struktur herauszulösen. Übrigens glaube ich, das dann alles funktioniert.

Mir würde es schon helfen, wenn einer kurz skizzieren könnte, wie man mit einer Tabellenänderung in der View normalerweise umgeht, wenn man sich in einer gefilterten Multiselektion befindet.

Wie ich es mache, hab ich ja kurz beschrieben. Evtl. müsste ich die relevanten Methoden noch mit einem 'synchronize' Block versehen.

Also, wenn sich die Tabellendaten geändert haben, bekommt die View auf jeden Fall einen fireTableDataChanged() Event. Wie würde ab da der Code bei euch aussehen?

Bei mir ist es etwa so:
Merke dir die Selektion (eindeutige Spalten in der Tabelle)
Merke dir den Filter
Entferne den Filter
Update die View
Schalte Filter wieder ein
Durchsuche den Filter nach der gemerkten Selektion.

Gruß
Arno
 
> Übrigens glaube ich, das dann alles funktioniert.

> wie man mit einer Tabellenänderung in der View normalerweise umgeht, wenn man sich in einer gefilterten Multiselektion befindet.

genau um das Zweite zu zeigen, aber auch deine Variante zu bewerten, wäre doch ein herausgelöstes Beispiel denkbar,

natürlich kann man auch so auf Beispiele hoffen, und es ist nicht gesagt dass ein Programm von dir garantiert zu Antworten führt,
aber die Möglichkeit bleibt, dass mit einem fertigen Programm, indem man vielleicht nur wenig ändern muss, mehr Reaktion angeregt werden kann als mit mühevollen kompletten Zusammenbau,

da du auf Antwort hoffst, bleibt im Extrem nun mal letzlich bei dir zig Stunden Vorbereitung hängen, für nur noch kurze Antwort jemand anderes,
andere Verhältnisse sind nicht ausgeschlossen, aber unwahrscheinlicher 😉

soweit um das noch einmal zu betonen, musst du nicht weiter kommentieren, ich nerve nicht nochmal damit 😉

--------

Fehlermeldung könnte immer noch schnelle Hinweise bringen

-----

der Server ist vorerst wirklich komplett außen vor zu lassen, der Rest ist schon kompliziert genug um für sich erstmal betrachtet zu werden
(absolute Expertenantwort nicht ausgeschlossen)
 
Hi,

die Sache hat sich mittlerweile erledigt. Die Vorgehensweise war gar nicht das Problem und hat sich im Nachhinein als richtig herausgestellt.
Es war letztendlich eine simple und stillschweigend ignorierte 'Out of Range' Exception die das Problem verursacht hat, weil an dieser Stelle der Model- mit dem Viewindex verwechselt wurde.

Danke für die angebotene Hilfe,
Arno
 

Zurück
Oben