jTable nach Datenänderung neu zeichnen?

shocking

Mitglied
Hi,

ich bin noch absoluter Anfänger, also bitte nicht gleich schimpfen. Ich weiß, dass dieses Thema schon einige Male angesprochen wurde, aber ich weiß nicht, wie ich die angegebenen Lösungen in mein Problem einbauen soll.

Ich habe eine jTable, die per ModelCustomers (abgeleitet von DefaultTableModel) die Tabelle mit Daten füllt. Die jTable ist an sich nicht editierbar, aber wenn man einen Doppelklick auf eine Zeile macht, wird ein neuer jFrame geöffnet, der die Daten in der DB ändern lässt. Nach dem schließen dieses jFrames soll die jTable nun mit den geänderten bzw. neuen Daten angezeigt werden. WIe kann ich dies auslösen? Sorry, aber ich weiss nicht, wo genau ich fireTableDataChanged() aufrufen muss. Und wie sage ich dem Model aus dem jFrame mit der jTable heruas, dass sich etwas geändert hat?

Hier mein TableMOdel:
Code:
/*
 * ModelCustomers.java
 *
 * Created on 4. April 2007, 09:29
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package admintool.tableModels;

import admintool.*;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Jana
 */
public class ModelCustomers extends DefaultTableModel{
   
   DBConnection _dbConn; 
   Connection _conn;
   Statement _state;
       
   /** Creates a new instance of ModelCustomers */
    public ModelCustomers() {
        _dbConn = DBConnection.getInstance();
        connectDB();
        setRowCount(getNumberOfRows());
        setColumnCount(getNumberOfColumns());
        setDataVector(getDataValues(), getColumnHeaders());
        closeStatement();
    }
    
    public boolean isCellEditable(int row, int column){
        return false;
    }
    
    private void connectDB(){
        try{
            _conn = _dbConn.getConnection();
            _state = _conn.createStatement();
        }
        catch (SQLException ex){
            ex.printStackTrace();
        }
    }
    
    private int getNumberOfRows(){
        int result = 0;
        
        try{
            ResultSet _res = _state.executeQuery("SELECT userid, sap_nr, publisher_name, publisher_title, contact_person FROM tbl_users");
            
            while (_res != null && _res.next()){
                result++;
            }
            _res.close();
        }
        catch (SQLException ex){
            ex.printStackTrace();
        }
        
        return result;
    }
    
   private int getNumberOfColumns(){
        int result = 0;
        
        try{
            ResultSet _res2 = _state.executeQuery("SELECT userid, sap_nr, publisher_name, publisher_title, contact_person FROM tbl_users");
            ResultSetMetaData resMeta = _res2.getMetaData();
            
            result = resMeta.getColumnCount();
            _res2.close();
        }
        catch (SQLException ex){
            ex.printStackTrace();
        }
        
        return result;
    }
   
    private String[] getColumnHeaders(){
        String[] result = new String[getNumberOfColumns()];
        
        try{
            ResultSet _res3 = _state.executeQuery("SELECT userid as Benutzername, sap_nr as SAP, publisher_name as Verlag, "  +
                    "publisher_title as Titel, contact_person as Kontaktperson FROM tbl_users");
            ResultSetMetaData resMeta = _res3.getMetaData();
            
            for (int i = 0; i < resMeta.getColumnCount(); i++){
                result[i] = (resMeta.getColumnName(i+1));
            }
            
            _res3.close();
        }
        catch (SQLException ex){
            ex.printStackTrace();
        }
        
        return result;
    }
    
    private String[][] getDataValues(){
        String[][] result = new String[getNumberOfRows()][getNumberOfColumns()];
        
        try {
            ResultSet _res4 = _state.executeQuery("SELECT userid, sap_nr, publisher_name, publisher_title, contact_person FROM tbl_users");
            int i = 0;
            while (_res4 != null && _res4.next()){
                int j = 0;
                
                result[i][j] = _res4.getString("userid");
                result[i][++j] = _res4.getString("sap_nr");
                result[i][++j] = _res4.getString("publisher_name");
                result[i][++j] = _res4.getString("publisher_title");
                result[i][++j] = _res4.getString("contact_person");
                
                i++;
            }
            
            _res4.close();
        } 
        catch (SQLException ex) {
            ex.printStackTrace();
        }
        fireTableDataChanged();
        return result;
    }
    
    private void closeStatement(){
        try{
            _state.close();
        }
        catch(SQLException ex){
            ex.printStackTrace();
        }
    }
}

Gruß und danke
shocking
 
Rein theoretisch (das ist wohl die primitivste aber dadurch auch einfachste Möglichkeit) könntest du auf den JTable direkt die Methode setValueAt benutzen.
 
Hi,

ich habe eine Lösung für mich gefunden. Im Grunde genommen reicht es, wenn das Model neu zugewiesen wird:

jTable.setModel(new ModelCustomers());

Mein Problem war jedoch, dass ich vom geöffneten Frame aus nicht an die jTable ran kam (hab ich per NetBeans hinzugefügt, und am erstellten Code kann ich nichts ändern): Ich habe dieses Problem nun so gelöst, dass ch meinen MainFrame zum SIngleton umfunktioniert habe, so dass immer dieselbe Instanz benutzt wird. So kann ich vom geöffneten Frame aus per Getter an dioe jTable kommen...

Trotzdem vielen Dank für die Idee. DIe habe ich ausprobiert, aber die funktionierte bei meiner Version leider nicht ;-(
 
Hallo

Warum rufst du nicht einfach die Funktion auf die im TabelModel extra dafür vorgesehen ist?


Code:
tableModelName.fireTableDataChanged();

Nur halt so eine Idee.

;)

Gruß

Gora
 
Zurück