# JTable direkt editierenund in  Datenbanken speichern



## nieselfriem (8. Feb 2011)

Hallo!

Es gibt reichlich Beispiele, wie man Daten aus einer Datenbank liest und diese in JTables darstellt. Nun möchte ich gerne die gelesenen Daten direkt in der Tabelle editieren können (im Grundlegenden auch nicht das Thema) um sie dann wieder mittels eines Buttons (Speichern) wieder in der Datenbank speichern zu können. Kennt jemand ein Tutorial was sich mit dieser Thematik beschäftigt. Bisher habe ich es immer so gehalten, dass ich mittels Doppelklick auf die Zeile der Tabelle ein Dialog geöffnet hat und darüber dann die Daten in der Datenbank gespeichert wurden. So richtig ist mir bisher nicht die zündende Idee der Umsetzung ohne diesen Dialog gekommen, da ich es nicht so richtig schaffe die entsprechenden Ereignisse die bearbeitet werden müssen zu kombinieren.

Gruß niesel


----------



## André Uhres (9. Feb 2011)

Hallo nieselfriem,

was willst du beim Speichern genau machen? Eine Möglichkeit wäre, wenn du auf "Speichern" klickst, dann nimmst du nur die ausgewählte Zeile, verwendest "getValueAt", um die Werte aus den Zellen zu holen und machst damit einen Update auf der Datenbank.

Gruß,
André


----------



## nieselfriem (9. Feb 2011)

Naja eigentlich währe es besser einfach zu ermitteln, welch Zellen editiert worden sind und diese dann zu speichern. Also ich bewege mich die Tabelle rauf und runter, ändere mal hier was, dann mal da was und das wird alles protokolliert und ggf. schon während dessen als QueryString mit den entsprechenden Werten in eine ArrayListe gespeichert. Diese soll dann einfach als Transaktion gespeichert werden. Hat jedoch den Nachteil, dass ich wenn ich in einer Zelle zweimal was ändere, dass erst der erste wert in der DB eingetragen wird und dann der andere. Aber ein anderer Weg fällt mir von Grundkonzept nicht ein. Mein Problem ist, wie ermittel ich welche Zellen wurden nach erstellen der Tabelle editiert um dann die Daten abzufragen.

Gruß und gute Nacht


----------



## Bib (9. Feb 2011)

Hallo,

mein Ansatz wäre ein TableModel zu erstellen das die Daten hält. Das Table Model sollte AbstractTableModel erweitern. Wenn in der JTable 'autoCreateColumnsFromModel' gesetzt ist werden die Daten automatisch in die Tabelle übernommen und synchron gehalten.
Für die Verbindung  zur Datenbank muss dann die Ereignisbehandlung noch implementiert werden, so dass auch hier eine automatische Synchronisation stattfindet.
So must Du Dich überhaupt nicht mehr 'zu Fuß' um die Aktualisierung kümmern.

In diesem Zusammenhang ist auch das Thema 'updateable ResultSets' von Interesse. 
Der nächste Schritt wäre dann eventuell die Nutzung der JPA (Java Persistence API) die noch eine Abstraktionsebene hinzufügt.

Ersten Überblick hierzu bekommt man über Wikipedia und dann natürlich auch über JAVADOC zum entsprechenden Paket 'javax.persistence'.

Vielleicht wäre das für Dich auch ein Ansatz. Viel Erfolg!

Bib


----------



## André Uhres (9. Feb 2011)

Den Ansatz von Bib finde ich auch gut.

Zu deinem Ansatz: wir können einen TableModelListener verwenden, den wir an das TableModel hängen.
Das TableModelEvent gibt uns dann Auskunft darüber, welche Zellen editiert wurden.

Gruß,
André


----------



## nieselfriem (9. Feb 2011)

Habe es erst einmal wie folgt lösen können, bzw. einen Ansatz:


```
public void tableChanged(TableModelEvent e) {
        	int row = e.getFirstRow();
        	int column = e.getColumn();
        	MyTableModel model = (MyTableModel)e.getSource();
        	String columnName = model.getColumnName(column);
        	System.out.println("Columname= "+columnName);
        	Object data = model.getValueAt(row, column);
        	System.out.println("Daten="+data);
        }
```
Die Lösung war auf der Oracle Seite  
Ich versuch es erst einmal auf dem herkömmlichen weg und später mit dem anderen vorgeschlagenen Ansatz

gruß niesel


----------

