Newsgroup: it.comp.java
Titolo: ResultSet in una JTable

Salve a tutti
vengo subito al dunque
Eseguo una select ad un DB ottenendo un ResultSet da cui mi ricavo anche il 
ResultSetMetaData.
Ho definito un modello per una JTable, ma non sono riuscito a visualizzare 
il risultato della query nella tabella
Potreste aiutarmi a trovare la soluzione?
Vi posto il codice di due classi
public class TableModelDB extends AbstractTableModel
{
    /**
     * Creates a new instance of TableModelClassDB
     */
    public TableModelDB(ResultSet aResultSet)
    {
        rs = aResultSet;
        try
        {
            rsmd = rs.getMetaData();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
    public int getRowCount()
    {
        try
        {
            //rs.last();
            return rs.getRow();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
            return 0;
        }
    }
    public int getColumnCount()
    {
        try
        {
         return rsmd.getColumnCount();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return 0;
        }
    }
    public String getColumnName(int c)
    {
        try
        {
            return rsmd.getColumnClassName(c + 1);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return "";
        }
    }
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        try
        {
            rs.absolute(rowIndex + 1);
            return rs.getObject(columnIndex + 1);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return null;
        }
    }
    private ResultSet rs;
    private ResultSetMetaData rsmd;
}
Questo è il JPanel dove dovrei visualizzare la tabella
        ...
        resultSet = sistema.caricaAnagrafica(obj);
        rsmd = resultSet.getMetaData();
        tableModel = new TableModelDB(resultSet);
        tabella = new JTable(tableModel);
        jScrollPane = new JScrollPane(tabella);
        add(jScrollPane);
        validate();
        while(resultSet.next())
Cosa dovrei inserire nel while?
Grazie 

 public class TableModelDB extends AbstractTableModel
Io farei estendere il tuo modello da DefaultTableModel. Poi non dovresti
fare il ciclo while fuori dal modello, ma dentro. In altre parole ti
servirebbe un metodo simile al seguente:
parseREsultset(ResultSet rs){
   while(rs.next()){
        // aggiungi i valori ad una riga (un vector)
   }
   this.setDataVector(vettore_righe, vettore_intestazioni);
}
e dovresti essere a posto.
Luca



{

// il resultset crealo direttamente all'interno del TableModel come ho
fatto io.
    public TableModelDB()
    {
        rs = sistema.caricaAnagrafica(obj);
        try
        {
            rsmd = rs.getMetaData();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
// qui c'è l'errore che tu hai commentato rs.last per avere il numero
di righe
// questo va deccomentato in quanto prima ti porti sull'ultima riga e
poi prendi il numero
// delle righe
    public int getRowCount()
    {
        try
        {
            //rs.last(); <- no così
            rs.last() z- così
            return rs.getRow();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
            return 0;
        }
    }
    public int getColumnCount()
    {
        try
        {
         return rsmd.getColumnCount();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return 0;
        }
    }
    public String getColumnName(int c)
    {
        try
        {
            return rsmd.getColumnClassName(c + 1);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return "";
        }
    }
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        try
        {
            rs.beforeFirst();
            rs.absolute(rowIndex + 1);
            return rs.getObject(columnIndex + 1);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return null;
        }
    }
    private ResultSet rs;
    private ResultSetMetaData rsmd;
}
Dopo di che il codice che dovresti usare per far visualizzare la tua
tabella
è il seguente.
        ...
        resultSet = sistema.caricaAnagrafica(obj); <- questo non ti
serve perchè lo esegui già dal tablemodel
        rsmd = resultSet.getMetaData(); <- questo neanche per la
stessa cosa di sopra
        // ti crei il modello in questo modo
        tableModel = new TableModelDB();
        tabella = new JTable(tableModel);
        jScrollPane = new JScrollPane(tabella);
        add(jScrollPane);
        validate();
        // e non devi fare nessun while per la visualizzazione in
quanto la fa in automatico
        while(resultSet.next())
Prova così e vedi che dovrebbe funzionare.
Fammi sapere.
Ciao Rocco.


Ciao Rocco, grazie per l'aiuto ma ho ancora dei problemi
Cerco di essere quanto + minuzioso possibile
Ho strutturato il progetto in tre livelli ovvero Boundary (interfacce 
utente), Control (nella fattispecie la classe Sistema) e Entity (scrivo le 
query da passare al DB e gestisco anche le connessioni con il DB)
I dati prelevati dalle Boudary li organizzo in oggetti che passo come 
argomento a sistema (in questo modo scrivo le query nelle entity e non nelle 
boundary)
Ho modificato il codice secondo i tuoi suggerimenti ad eccezione del 
costruttore di TableModelDB a cui gli passo l'oggetto come argomento 
scrivendo così:
public TableModelDB(Object[] obj)
invece che
public TableModelDB()
e di conseguenza anche quando istanzio l'oggetto tableModel  dalla classe 
TableModelDB scrivendo così
tableModel = new TableModelDB(obj);
invece che
tableModel = new TableModelDB();
Ti posto anche il metodo caricaAnagrafica della classe Sistema
public ResultSet caricaAnagrafica(Object[] obj)
    {
        Anagrafica tmpAnagrafica = new Anagrafica();
        String sql = tmpAnagrafica.caricaAnagraficaDaOggetto(obj);
        gest = new GestioneDB("localhost:3306","XXX","XXX","XXX");
        Connection connDB = gest.apriConnessioneDB();
        if(connDB != null)
        {
            ResultSet result = gest.eseguiSelect(sql, connDB);
            gest.chiudiConnessione(connDB);
            return result;
        }
        else
            return null;
    }
Il problema nel quale mi sto imbattendo è questo:
Cado in un'eccezione quando vado a compilare la segente riga di codice
rs = sistema.caricaAnagrafica(obj);
nella classe TableModelDB
L'eccezione è la seguente
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at Control.TableModelDB.<init>(TableModelDB.java:35)
Di nuovo grazie

 at Control.TableModelDB.<init>(TableModelDB.java:35)
Beh significa che il riferimento sistema non è inizializzato correttamente.
Controlla il codice che lo deve inizializzare.
Luca

 Luca
Si hai ragione
č stata una svista ;-)
Grazie 

Ciao, sono Paolo, .e ho un problema a visualizzare l'output di una query in 
uan Tabella, in particolare, ho postato una query al database e ho ottenuto 
un resultset e vorrei visualizzarlo in una Jtable contenuta in un Jpanel. Al 
momento sto usando Netbeans e un grosso problema sta nel fatto che vi e' un 
parte generata in automatico dall'IDE, che non e' modificabile, e quindi 
bisogna sapere dove inserire il codice.
Spero di essere stato sufficientemente chiaro.
Nel frattempo vi ringrazio in anticipo e aspetto una vostro aiuto.
Paolo