JTabel - RowFilter Daten für Berechnung filtern

Hein_nieH

Bekanntes Mitglied
Moinsen,

ich habe eine Frage, welche in ähnlicher Form auch in anderen Foren auftaucht, jedoch nicht ausreichend beantwortet wurde.

Wenn ich einen RowFilter erstelle und diesen im JTable anwende, dann erhalte ich eine gefilterte Tabelle.

Nun möchte ich die gefilterten Zeilen auch für eine Berechnung nutzen.
Gibt es da eine Möglichkeit, um z.B. ein ArrayList aus dem TableModel zu erzeugen, dass durch Anwendung des RowFilters auf die selben Zeilen enthält, so wie sie in der gefilterten Tabelle angezeigt werden?

Gruss Hein_nieH
 
Du kannst Dir die Daten aus dem Model selbst zusammen stellen. Du hast ja die JTable und damit kannst du die Anzahl der Zeilen abfragen (getRowCount()). Dann gehst Du die die indizes durch (0 bis getRowCount()-1) um dir dann die id des Models zu holen (convertIndexToModel(index)). Damit kannst Du dann den Eintrag aus dem Model lesen z.B. mit getValueAt.

Aber ist das notwendig? Du hast ja die Daten, Du hast den Filter. Du kannst Du direkt den Filter auch auf die Daten anwenden. Notwendig ist es aus meiner Sicht eigentlich nur, wenn Du wirklich Dinge aus der JTable brauchst, weil Da evtl. Spaltenposition, Sortierungen u.s.w. dynamisch sind. Daher hier wirklich genau überlegen, was Du da machen willst. Nicht, dass Du Dir hier x-y Probleme einhandelst.

Also evtl. etwas zur Erläuterung:
Ich sehe eine Trennung zwischen Darstellung selbst und den Daten. Filterungen und so sind da eher bei dem Modul mit den Daten. Wenn Du jetzt hier in dem Bereich etwas machen willst, dann ist die Frage, ob dies nicht evtl. komplett in das Modul Daten gehören könnte. Dann hast Du halt eine Operation, die auch einen Filter nehmen könnte.
Aber auch anders herum ist es valide: Du hast halt auf den Daten gewisse Operationen. Und hier ist es jetzt Sache der UI, dass da eben auf jedem noch sichtbaren Bereich etwas aufgerufen wird. (Wobei ich hier nur eine grobe Trennung UI vs Daten mache. Das ist noch zu grob. Wie ist es aufgeteilt? MVVM? MVC? Der Controller will die Details des JTable Controls nicht wirklich kennen, oder?

Ich hoffe, ich habe Dich mit den Ausführungen jetzt nicht zu sehr verwirrt. Du hast auf jeden Fall ein mögliches technisches Vorgehen auf Basis der JTable und Du kannst Dir den Aufbau deiner Application dies bezüglich frei überlegen.
 
Hallo KonradN

vielen Dank für die Antwort.
In meinem Fall habe ich im TableModel ein ArrayList, welches eine Vielzahl von Records enthält.
Jeder im ArrayList enthaltene Record entspricht in der Tabelle einer Row.
Meine Überlegung im Zuge eines Refactoring war es, aus dem ArrayList die Rows zu identifizieren, welche dem definierten RowFilter entsprechen. Hierzu hatte ich vor eine Funktion zu entwickeln, welche abfragt, ob der Record(x) den Kriterien des RowFilters entspricht.

Ich hoffe dass ich mein Problem verständlich beschreiben konnte.

Gruss Hein_nieH
 
Hierzu hatte ich vor eine Funktion zu entwickeln, welche abfragt, ob der Record(x) den Kriterien des RowFilters entspricht.
Das sollte kein größeres Problem darstellen, wenn Du einen Blick in den Quellcode von DefaultRowSorter wirfst, dann findest Du eine private Methode boolean include(int row). Die (und alles, was Du sonst noch brauchst) kannst Du extrahieren, dann brauchst Du nur über Dein Model zu iterieren und die include-Methode "befragen".
 
Also der Weg, den ich genannt habe, geht so ja auch. Denn Du hast (sowohl im DefaultRowSorter als auch im RowFilter) die Methode convertRowIndexToModel. Wenn Dein Model ein Array von records ist, kannst Du also alle Rows der Tabelle durchgehen, mit der Methode den index im Model bekommen und dann den record aus dem Array z.B. einer List hinzu fügen.

Du hast also den DefaultRowSorter als Variable sorter, dein Record sei Student und du hast ein Array students mit den Daten deines Models:
Java:
List<Student> filteredStudents = new ArrayList<>();
for (int i = 0; i < sorter.getViewRowCount(); i++) {
    int modelRow = sorter.convertRowIndexToModel(i);
    filteredStudents.add(students[modelRow]);
}

Das wäre also direkt die Implementierung unter Nutzung der UI Klassen.
 
Aha,
die Schleife war der entscheidende Hinweis.
Werde das dann mal ausprobieren.
Wenn es funktioniert ist mein Problem gelöst.

Vielen Dank für die Hilfestellung

Gruss Hein_nieH
 

Zurück
Oben