Swing JTable mit Datenstruktur verknüpfen

Ratzer

Mitglied
Hallo!
Ich möchte gerne, dass meine JTable und meine Liste synchron gehalten werden. Das bedeutet, wenn man am TableModel etwas ändert, soll sowohl die JTable als auch die Liste verändert werden. Ich habe zunächst an das Observer/Observable Pattern gedacht. Also das TableModel wäre dann Oberservable und immer, wenn sich etwas daran ändert, würde meine Liste informiert werden und sie wird automatisch angepasst. Dazu meine erste Frage: Hat die JTable nicht schon so was? Also es gibt ja Methoden wie fireTableDataChanged(), die vom Model ausgelöst werden und an die View, also die JTable, geschickt werden. Könnte ich die einfach überschreiben, sodass zusätzlich auch noch meine Liste verändert wird oder müsste ich wirklich das Observer/Observable Pattern benutzen?
Dann zu meiner zweiten Frage. In meiner JTable sind Objekte gespeichert, deren Attribute in mehreren Spalten ausgegeben werden. Möchte ich nun ein Objekt ändern, müsste ich es ja irgendwie in meiner Liste wiederfinden. Da gibt es wohl keine andere Möglichkeit als die Liste durchzugehen und alle Einträge miteinander zu vergleichen bis das richtige Objekt gefunden ist, oder?
 

Michael...

Top Contributor
Ich möchte gerne, dass meine JTable und meine Liste synchron gehalten werden. Das bedeutet, wenn man am TableModel etwas ändert, soll sowohl die JTable als auch die Liste verändert werden. Ich habe zunächst an das Observer/Observable Pattern gedacht. Also das TableModel wäre dann Oberservable und immer, wenn sich etwas daran ändert, würde meine Liste informiert werden und sie wird automatisch angepasst. Dazu meine erste Frage: Hat die JTable nicht schon so was? Also es gibt ja Methoden wie fireTableDataChanged(), die vom Model ausgelöst werden und an die View, also die JTable, geschickt werden. Könnte ich die einfach überschreiben, sodass zusätzlich auch noch meine Liste verändert wird oder müsste ich wirklich das Observer/Observable Pattern benutzen?
keine Ahnung was genau Du vorhast. Aber eventuell würde es Sinn machen ein gemeinsames Model zu definieren - also eine Klasse die sowohl TableModel als auch ListModel implementiert.
Dann zu meiner zweiten Frage. In meiner JTable sind Objekte gespeichert, deren Attribute in mehreren Spalten ausgegeben werden. Möchte ich nun ein Objekt ändern, müsste ich es ja irgendwie in meiner Liste wiederfinden. Da gibt es wohl keine andere Möglichkeit als die Liste durchzugehen und alle Einträge miteinander zu vergleichen bis das richtige Objekt gefunden ist, oder?
Wie möchtest Du die Objekte ändern? Über die JTable/JList? Dann hast Du ja den Index.
Wie werden die Objekte verwaltet und worüber kann man das "richtige" Objekt identifizieren?
 

Ratzer

Mitglied
keine Ahnung was genau Du vorhast. Aber eventuell würde es Sinn machen ein gemeinsames Model zu definieren - also eine Klasse die sowohl TableModel als auch ListModel implementiert.

Es ist doch eigentlich fast normal, dass man eine JTable durch sowas wie eine ArrayList füllt oder nicht?
Vielleicht wäre es sinnvoll, wenn das TableModel einfach nur auf die ArrayList zugreift, ohne selbst die Daten zu verwalten. Nur wenn man in der ArrayList einen Eintrag verändert, müsste man ja die ganze Tabelle wieder neu zeichnen, ist das wohl sinnvoll? Ich hab das ja bisher so, dass erst das TableModel geändert wird (in der entsprechenden Zelle) und dann müsste ja auch noch die ArrayList geändert werden. Und um in der ArrayList das Objekt zu finden, müsste ich erst alle Strings aus der JTable holen und die komplette List durchlaufen bis ich das Objekt gefunden habe, welches auch genau diese Strings enthält.
 

Michael...

Top Contributor
Es ist doch eigentlich fast normal, dass man eine JTable durch sowas wie eine ArrayList füllt oder nicht?
Normal? Kann ich nicht sagen. Durchaus üblich? Ja.
Vielleicht wäre es sinnvoll, wenn das TableModel einfach nur auf die ArrayList zugreift, ohne selbst die Daten zu verwalten.
Einem TableModel reicht eine Referenz auf die ArrayList, allerdings ist eine wesentliche Aufgabe des Models die Daten zu pflegen und zu verwalten - heißt: Änderungen an der Liste oder deren Inhalten sollten auch über das Model vorgenommen werden.
Nur wenn man in der ArrayList einen Eintrag verändert, müsste man ja die ganze Tabelle wieder neu zeichnen, ist das wohl sinnvoll?
Die JTable verfügt über Mechanismen um Zeilen/Zellen gezielt zu aktualisieren, s. TableModelEvent (Java Platform SE 6)
Ich hab das ja bisher so, dass erst das TableModel geändert wird (in der entsprechenden Zelle) und dann müsste ja auch noch die ArrayList geändert werden.
s.o. die Verwaltung der ArrayList sollte möglichst nur über das Model erfolgen.
Und um in der ArrayList das Objekt zu finden, müsste ich erst alle Strings aus der JTable holen und die komplette List durchlaufen bis ich das Objekt gefunden habe, welches auch genau diese Strings enthält.
...sollte also irrelevant sein.
Du scheinst hier eine doppelte Datenhaltung zu betreiben einmal im TableModel und zusätzlich noch in einer ArrayList ausserhalb. Ist m.M. nicht unbedingt sinnvoll.
 

Ratzer

Mitglied
Also ich würde das dann so machen, dass ich dem TableModel eine Referenz zur ArrayList gebe und ich die getValueAt und setValueAt Methoden überschreibe, sodass sie nur Inhalte der ArrayList ausgeben bzw. verändern.
Jetzt kommt allerdings noch eine Schwierigkeit hinzu. In meiner Liste sind die Einträge ja so angeordnet, wie sie eingetragen wurden, genauso wie in der Tabelle. Wenn ich jetzt aber einen TableRowSorter verwende, sind Zeilen- und Spaltennummer alle anders. Das bedeutet durch die Zeilen- und Spaltennummern könnte ich nicht mehr auf den Index der ArrayList zugreifen, weil die ArrayList ja nicht mitsortiert wird. Kann man da irgendwas machen, ohne die ArrayList immer mit zu sortieren?
 

Michael...

Top Contributor
Also ich würde das dann so machen, dass ich dem TableModel eine Referenz zur ArrayList gebe und ich die getValueAt und setValueAt Methoden überschreibe, sodass sie nur Inhalte der ArrayList ausgeben bzw. verändern.
passt ja auch.
Wenn ich jetzt aber einen TableRowSorter verwende, sind Zeilen- und Spaltennummer alle anders. Das bedeutet durch die Zeilen- und Spaltennummern könnte ich nicht mehr auf den Index der ArrayList zugreifen, weil die ArrayList ja nicht mitsortiert wird. Kann man da irgendwas machen, ohne die ArrayList immer mit zu sortieren?
JTable bietet Methoden an um anhand der Indizes aus der JTable die Indizes des Models und umgekehrt zu ermitteln: JTable (Java Platform SE 6)
Aber ist das in Deinem Fall nicht irrelevant, wenn die Daten im Model immer unsortiert bleiben?
 

Ratzer

Mitglied
Oh, coole Funktion. Die werde ich wohl auch brauchen, denn das Editieren von Zellen soll über Buttons geschehen. Wenn ich also auf eine Zelle klicke und dann auf den Editier-Button, soll die entsprechende Zelle über ein JDialog editiert werden können. Den Index der selektierten Zeile kriege ich ja nur über das JTable und mit dieser Funktion kann ich dann ja den passenden Index im Model herausfinden, wenn ich das richtig verstehe.
 

Jigga

Bekanntes Mitglied
Ich habe eigentlich das Selbe vor, sprich den Inhalt einer Datenbank Tabelle soll in einer JTable dargestellt werden. Ich wollte mir jetzt hierfür ein eigenes TableModel erstellen. Die Daten aus der DB werden in einen Vector/eine ArrayList geladen (was ist vorteilhafter?).
Mir ist noch nicht ganz klar, wie ich das ganze so abstimme, dass mein Model auf "Reihe hinzufügen/entfernen/ändern" so reagiert, dass beides(JTable und Vector/ArrayList) dementsprechend aktualisiert werden ohne die ganze JTable neu zu laden. Dabei kann "Reihe ändern" vernachlässigt werden, da der Benutzer nicht in der Lage sein wird selbst Daten zu ändern.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Ich habe eigentlich das Selbe vor, sprich den Inhalt einer Datenbank Tabelle soll in einer JTable dargestellt werden. Ich wollte mir jetzt hierfür ein eigenes TableModel erstellen.
Ist nicht das selbe. Bist nicht der erste. Wurde schon in unzähligen Post mehrfach beantwortet. Wirf mal einen Blick in das Forum Datenbankprogrammierung ;-)
Die Daten aus der DB werden in einen Vector/eine ArrayList geladen (was ist vorteilhafter?).
Heutzutage speichert man die Daten als eigene Objekte (falls sinnvoll) in einer ArrayList und definiert dazu ein eigenes TableModel. Grundsätzlich spricht aber nichts dageben Vector zu benutzen.
Mir ist noch nicht ganz klar, wie ich das ganze so abstimme, dass mein Model auf "Reihe hinzufügen/entfernen/ändern" so reagiert, dass beides(JTable und Vector/ArrayList) dementsprechend aktualisiert werden ohne die ganze JTable neu zu laden.
Wo werden denn Reihen hinzugefügt/entfernt?
Vector/ArrayList enthält die Daten, Model verwaltet Vector/ArrayList und somit die Daten und JTable stellt die Daten (unter Benutzung des Models) dar ==> eingefügt/entfernt wird über das Model.
 

Jigga

Bekanntes Mitglied
Ist nicht das selbe. Bist nicht der erste. Wurde schon in unzähligen Post mehrfach beantwortet. Wirf mal einen Blick in das Forum Datenbankprogrammierung ;-)
oh dann habe ich im falschen unterforum gesucht...:oops:
ich schaue mal dort rein,danke.
Heutzutage speichert man die Daten als eigene Objekte (falls sinnvoll) in einer ArrayList und definiert dazu ein eigenes TableModel. Grundsätzlich spricht aber nichts dageben Vector zu benutzen.
so hatte ich das auch geplant. ich habe bereits einen konstruktor, der mir objekte aus den daten erstellt und diese in einer ArrayList speichert.
Wo werden denn Reihen hinzugefügt/entfernt?
Vector/ArrayList enthält die Daten, Model verwaltet Vector/ArrayList und somit die Daten und JTable stellt die Daten (unter Benutzung des Models) dar ==> eingefügt/entfernt wird über das Model.
nach drücken eines Buttons sollen alle zeilen durchgegangen werden,falls eine variable meinen anforderungen entspricht, soll diese Zeile geändert werden. hier müsste ich doch eigentlich auf die DB zugreifen,den eintrag abändern und anschließend irgendwie in meiner ArrayList nach der Zeile suchen und diese ebenfalls abändern. anschließend muss das ganze ja auch noch an die JTable weitergegeben werden,damit diese den neuen Inhalt darstellt. Ähnlich läuft das ganze bei Zeil entfernen/hinzufügen ab, nur das hier direkt ein Eintrag in der DB Tabelle erstellt wird und dementsprechend ein neues Objekt in die ArrayList hinzugefügt werden muss.
Meinem Verständnis entzieht sich gerade das synchrone abändern der DB Daten mit der ArrayList.

Beispiel: Im restlichen Programm wird eine Methode aufgerufen, die in die DB ein neue Zeile schreibt. Wie verfahre ich anschließend?DB Tabelle auslesen und die JTable neu laden?
Oder soll ich zuerst ein Objekt erzeugen,dieses in die ArrayList und in die DB speichern. Dann müsste aber mein Model noch irgendwie mitbekommen,dass etwas neues hinzugekommen ist?

EDIT: Ich glaube so langsam wirds klarer: Beim hinzufügen einer neuen Zeile erstelle ich eine neue Zeile in der DB,wenn dies erfolgreich war erstelle ich aus den Infos ein Objekt und füge es meinem Model hinzu. Dieses erledigt durch dessen Methoden den Rest.
Ist das soweit richtig?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Beispiel: Im restlichen Programm wird eine Methode aufgerufen, die in die DB ein neue Zeile schreibt. Wie verfahre ich anschließend?DB Tabelle auslesen und die JTable neu laden?
Oder soll ich zuerst ein Objekt erzeugen,dieses in die ArrayList und in die DB speichern. Dann müsste aber mein Model noch irgendwie mitbekommen,dass etwas neues hinzugekommen ist?
Kommt auf den konkreten Anwendungsfall an:
- man könnte einen DatenbankController definieren über den alle Aktionen von und zur Datenbank laufen. Dieser müsste die Informationen darüber, dass Daten in der DB eingefügt, gelöscht, geändert werden an das TableModel weiterreichen
- oder man geht den umgekehrten Weg und alle Datenoperationen laufen erst über das Model und dieses infomiert neben der JTable auch den DatenbankController, der als Listener/Observer am Model registriert ist - das geht natürlich nur, wenn die Daten nur in einem Model gehalten werden.

Die JTable neu zu laden ist nicht notwendig, dafür werden ja im TableModel Mechanismen implementiert die die JTable über Änderungen informieren (das ist ja eine wesentliche Existenzberechtigung eines Models) -siehe z.B. DefaultTableModel oder AbstractTableModel
 

Jigga

Bekanntes Mitglied
habe es mitlerweile etwas verstanden denke ich.jtable mit datenbank anbindung funktioniert soweit. jetzt wollte ich aber noch einen RowSorter implementieren,bzw habe dies bereits getan welcher auch super funktioniert.
das problem dabei ist, dass sobald meine tabelle sortiert ist,ich nicht direkt auf meine daten in der ArrayList zugreifen kann.
jetzt ergeben sich für mich folgende lösungswege:
1)eine ID für die Objekte einführen,diese bei der gewünschten methode aus der tabelle lesen,alle objetkte in der liste durchgehen und nach der ID suchen.
2)die arraylist ebenfalls sortieren: hierbei weiß ich nicht,ob dies möglich wäre bzw mich zum erfolg führen würde.
problem: würde die datenstruktur in der ArrayList der der angezeigten daten entsprechen?

gibt es einen eleganteren weg dies zu lösen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Vector Datenstruktur für JTable will nicht :-( AWT, Swing, JavaFX & SWT 6
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben