JTable aktualisieren

gondor

Mitglied
hallo!

leider habe ich ein problem. dieses sieht in etwa so aus:

ich habe 2 buttons mit denen ich werte in eine JTable fülle und diese auf die GUI anzeigen lasse:

Code:
void Appl_jButton_30min_actionPerformed(ActionEvent e) {        table = null;      scrollPane = null;        table = new JTable();      scrollPane = new JScrollPane(table);        /*Tabellen-Modell erzeugen*/      table.setModel(ctrl_measurement.getDataForTable(50));      /*Tabellen-Modell + ScrollPane auf Panel setzen*/      jPanel7.add(scrollPane, BorderLayout.CENTER);        /*Update der GUI (Tabelle)*/      contentPane.validate();    }
hier werden 50 werte in die JTable geschrieben und angezeigt

Code:
void Appl_jButton_1h_actionPerformed(ActionEvent e) {      table = null;      scrollPane = null;        table = new JTable();      scrollPane = new JScrollPane(table);        /*Tabellen-Modell erzeugen*/      table.setModel(ctrl_measurement.getDataForTable(40));      /*Tabellen-Modell + ScrollPane auf Panel setzen*/      jPanel7.add(scrollPane, BorderLayout.CENTER);        /*Update der GUI (Tabelle)*/      contentPane.validate();    }
hier werden 40 werte in die JTable geschrieben und angezeigt


mein Problem ist leider, dass sich die JTable nicht 'korrekt' aufbaut. also, wenn ich zuvor die 50 werte aufrufe zeigt er diese korrekt an, aber sobald ich danach nur 40 werte haben will, zeigt er immer noch die 50 werte an, obwohl er das TableModel mit 40 werten richtig erzeugt.

also sobald ich auf das jTable bzw. ScrollPane klicke kommt die 'alte' tabelle wieder

wo liegt hier das problem?

gr33tz,
 
Tach,
normalerweise genügt ein fireTableDataChanged() auf dem TableModel.
Allerdings sehe ich bei Dir kein solches. Sauberer (und einfacher, auch wenn es evtl. auf den ersten Blick nicht so aussehen mag) ist eine Implementierung mit einem eigenen TableModel. Dann kannst Du auch darauf fireTableDataChanged() aufrufen.
 
hm... das hab ich nicht ganz vertsanden.

ich benutze ein Tabellen-Modell. hier einmal der code:

Code:
/*Methode gibt 'ein TabellenModell' zurück, wenn die Query erfolgreich auf die DB ausgeführt wurde*/    public DefaultTableModel getDataForTable(int range_) {        ArticCell_ConnectionDB con = null;      ArticCell_SQL_DB sqldb = null;      DefaultTableModel data = null;      ResultSet rSet = null;        Object[][] odata = null;      Object[] clmHeaders = null;        System.out.println("begin: "+System.currentTimeMillis());        /*Verbindung zur DB herstellen, Statement initialisieren*/      con = new ArticCell_ConnectionDB();      sqldb = new ArticCell_SQL_DB();        /*Table-Model erzeugen*/      data = new DefaultTableModel();        /*SQL-Query ausführen und ResultSet zurückholen */      rSet = sqldb.getResultMySQLQuery(sqldb.setStatementMySQL(con.getConnectionMySQL()), "SELECT * FROM test WHERE db_time <= " + range_ + " ;");        ResultSetMetaData rsmd = null;      int clmCnt = -1;        try {        rsmd = rSet.getMetaData();        clmCnt = rsmd.getColumnCount();      } catch (SQLException e) {        e.printStackTrace();      }        if (rsmd == null || clmCnt == -1) {        throw new RuntimeException("rsmd is null");      }      try {        rSet.beforeFirst();        rSet.last();        int rowCnt = rSet.getRow();        rSet.beforeFirst();          odata = new Object[rowCnt][clmCnt];        clmHeaders = new Object[clmCnt];          /*Spaltenüberschriften setzen*/        for (int i = 1; i <= clmCnt; i++) {          clmHeaders[i - 1] = rsmd.getColumnName(i);        }          int row = 0;          /*Werte setzten*/        while (rSet.next()) {            for (int i = 1; i <= clmCnt; i++) {            odata[row][i - 1] = rSet.getString(i);          }          row++;        }          /*Werte uns Spaltenüberschriften dem Tabellen-Modell übergeben*/        data.setDataVector(odata, clmHeaders);          System.out.println("getDataForTable --> create DefaultTableModel --> Done");          /*ResultSet und Statement closen*/        sqldb.closeResultMySQL();        sqldb.closeStatementMySQL();          System.out.println("ende: "+System.currentTimeMillis());        }      catch (SQLException e1) {        e1.printStackTrace();      }        return data;    }

ich hoffe, du kannst damit etwas anfangen. ;)

das model wird spater der table übergeben:

Code:
table.setModel(ctrl_measurement.getDataForTable(40));

danke für hilfe!

gondor(..)
 
Original geschrieben von gondor
hm... das hab ich nicht ganz vertsanden.

ich benutze ein Tabellen-Modell. hier einmal der code:

Code:
/*Methode gibt 'ein TabellenModell' zurück, wenn die Query erfolgreich auf die DB ausgeführt wurde*/    public DefaultTableModel getDataForTable(int range_){...}


ich hoffe, du kannst damit etwas anfangen. ;)

das model wird spater der table übergeben:

Code:
table.setModel(ctrl_measurement.getDataForTable(40));


danke für hilfe!

gondor(..)

Schon klar, ich meinte aber die Implementierung eines *eigenen* TableModels, also einer eigenen Klasse, z.B.

public class MyTableModel extends DefaultTableModel
{ //...
}

mit den zugehörigen Implementierungen der Interface-Methoden
getRowCount
getColumnCount
getColumnName
getValueAt
 
ok, aber ob das der grund meines problems ist? außerdem kann ich doch 'fireTableDataChanged();' auf mein 'DefaultTableModel' anwenden (wenn ich möchte, wobei ich nicht weiss was die methode genau macht...)

ich denke am tabellen-modell selber ist alles im lack. zumindest zeigt er ja die gewünschte tabelle an (wenn ich auf einen gewünschten button drücke), nur wenn ich anschliessend auf die table in der GUI klicke oder den scroll-balken benutzen will tauchen wie aus dem nichts wieder die alten werte auf.

er scheint beim ersten ausführen die table zu behalten....

danke für hilfe... benötige aber leider weitere ;)

gondor(..)
 
@Snape

... oder kannst du meine klasse umbauen, so dass es deiner meinung nach richtig ist? wäre nett, da ich hier einfach nicht weiterkomme :(
 
Tach,
probier mal

table.getModel().fireTableDataChanged();

Mehr kann ich Dir jetzt auch nicht helfen - Zeit ist Geld...
 
so?

Code:
void Appl_jButton_1h_actionPerformed(ActionEvent e) {      table = null;      scrollPane = null;        table = new JTable();      scrollPane = new JScrollPane(table);        /*Tabellen-Modell erzeugen*/      table.setModel(ctrl_measurement.getDataForTable(50));            table.getModel().fireTableDataChanged();        /*Tabellen-Modell + ScrollPane auf Panel setzen*/      jPanel7.add(scrollPane, BorderLayout.CENTER);        /*Update der GUI (Tabelle)*/      contentPane.validate();    }

bekomme leider eine fehlermeldung:

"ArticCell_Frame_Applikation.java": cannot resolve symbol: method fireTableDataChanged ()in interface javax.swing.table.TableModel at line 259, column 22

hätte nicht gedacht, dass das problem so schwerwiegend ist...

gondor(..)
 
Zurück