# jTable aktualisieren!



## Java Nooob (24. Sep 2005)

Folgendes Problem.

ICh habe ein jTable mit einem DefaultTable Model:

```
TableCheckOut.setModel(new javax.swing.table.DefaultTableModel(datacheckout, titlecheckout));
```

datacheckout ist ein Vector den ich aus einer Datenbank füllen lasse:

```
public static Vector TableDataCheckIn(){
    Vector<Vector> data = new Vector<Vector>();
    database.DataConnection.conOpen("SELECT * FROM CheckIn WHERE Status = '1'");
    
    try{
        
         while (database.DataConnection.rSet.next())
            {
               Vector record = new Vector();
               record.add(database.DataConnection.rSet.getString(1));
               record.add(database.DataConnection.rSet.getString(2));
               record.add(database.DataConnection.rSet.getString(3));
               System.out.println(database.DataConnection.rSet.getString(12));
               data.add(record);
               
            }
         
        }catch (Exception e){
            e.printStackTrace();        
        }
    database.DataConnection.conClose();
    return data;
}
```

soweit so gut. Es können jedoch mehrere Benutzer auf die Datenbank zugreifen und werte ändern. 
Wie schaffe ich es das jedes mal wenn ein Wert geändert wurde (egal wer ihn geändert hat) mein jTable aktualisiert wird.
Das Programm läuft später auf mehreren PC gleichzeitig.

Hoffe ich habe es nicht zu kompliziert erklärt.

MFG


----------



## Guest (24. Sep 2005)

Ein einfaches Beispiel habe ich gerade nicht zur Hand, aber es lässt sich u.a. wie folgt lösen.

1) jeder Datensatz muss eindeutig identifizierbar sein, es reicht nicht nur die anzuzeigenden Werte zu übertragen.
Klartext: Die PK's (Primary Keys) der Datensätze musst du auch übertragen.
2) Wenn die Daten, die beim Client ankommen, versteckte Daten enthalten (z.B. die PK's), dann brauchst du
eine modififzierte Implementierung des TableModel, die nur die Spalten anzeigt, die du haben möchtest.
3) Serverseitig musst du Updates in Transaktionen durchführen
4) Änderungen kannst Du mit z.B. Versions-Pattern erkennen (zusätzliche Spalte in der Tabelle, die bei jedem Update 
inkrementiert wird) SELECT vor UPDATE ist nötig.
5) Nach jedem Update schickst Du eine JMS Message mit den PK's der geänderten, gelöschten oder hinzugefügten
Datensätze
6) Clientseitig wartest Du auf solche Messages und holst neue oder geänderte Datensätze vom Server bzw. entfernst 
clientseitig die gelöschten Datensätze aus dem TableModel.

Wie du siehst, ist es keine Sache für paar Zeilen Beispielcode. Es hängt auch davon ab, was
du da serverseitig am Laufen hast.


----------



## Der_Konfigurator (28. Sep 2005)

Also ich nehme an du greifst direkt aus deinem Programm auf die Datenbank zu ?

Es gibt eine Möglichkeit diese updates Relativ Simple zu realisieren.

Das Zauberwort heißt RMI mit Callback Verfahren. (Remote Method Invocation)
Hierfür wäre es aber notwendig das du dein Programm in einen RMI-Client verwandelst der Remote Methoden zum updaten der Tables anbietet, was nicht weiter tragisch ist und auf der Datenbank Seite , einen RMI - Server realisierst der deine SQL Anfragen an die Datenbank weiterleitet und die Results liefert. Das ist eigentlich auch kein großer Aufwand.

Der Vorteil: Jeder Client der sich auf den Server connected, kann von dir in einem Vector gespeichert werden.
Hierbei wird nur eine Referenz auf das RemoteObjekt gespeichert. 
Wenn jetzt ein Client Daten ändert, kannst du über den Vector laufen und bei jedem Client die Update methoden aufrufen. Somit tun sich deine Tables dann refreshen.

Über RMI gibt es gute Beispiele bei Sun, hört sich kompliziert an ist es aber nicht.

Hoffe es hilft dir.


----------

