Popolare jTable da DB

di il
4 risposte

Popolare jTable da DB

Salve a tutti, come da titolo devo popolare una jTable da DB, il programma che uso è Netbeans.
Come modello di tabella devo usare un AbstractTableModel e non Default (richiesta del prof).

La classe DBTableModel che estende AbstractTableModel è stata fornita dal prof.

L'errore che mi ritorna, ripetuto varie volte è:
Resultset chiuso: getRow

non riesco proprio a capire perchè mi dia questo errore, mi setta il nome delle colonne in modo corretto, ma le righe non ci sono
Vi posto il codice:


package javaapplication9;

import java.sql.*;
import java.util.logging.Level;
import oracle.jdbc.pool.OracleDataSource;
import javax.swing.*;
import java.sql.Connection;
import javax.swing.table.DefaultTableModel;

public class MioFrame extends javax.swing.JFrame {

    int pos=1;
    Connection conn=null;
    DBTableModel modelTable;

    public MioFrame() {
        initComponents();

        try {
            //Connessione al DB
           OracleDataSource ods = new OracleDataSource();
            ods.setURL("jdbc:oracle:thin:@//localhost:1521/xe");
            ods.setUser("--------");
            ods.setPassword("********");
            conn=ods.getConnection();

 String q="SELECT * FROM  LISTADESIDERI WHERE ID_CLIENTE = ? ";
 PreparedStatement stAccess =conn.prepareStatement (q, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

 stAccess.setString(1,"1234567890");//con questo id sono sicura che ci sono dei dati
     
          //eseguo la query
          ResultSet rset=stAccess.executeQuery();

         modelTable = new DBTableModel(rset);
         jTable1.setModel(modelTable);
         modelTable.setRS(rset);
          
            rset.close();
          
        }catch (SQLException ex) {
       Logger.getLogger(MioFrame.class.getName()).log(Level.SEVERE, null, ex);
           }        
  }
  
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(15, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(75, 75, 75)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(147, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    
      public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MioFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration                   
}

Grazie mille a tutti

4 Risposte

  • Re: Popolare jTable da DB

    lady5 ha scritto:


    La classe DBTableModel che estende AbstractTableModel è stata fornita dal prof.

    L'errore che mi ritorna, ripetuto varie volte è:
    Resultset chiuso: getRow
    Quale sia il codice di DBTableModel non si sa .... non l'hai mostrato. Mi viene da pensare che DBTableModel utilizzi il ResultSet in modalità "scrollable", ovvero potendo andare avanti e indietro e a qualunque record in modo arbitrario. In base alle continue richieste dalla view ("dammi la cella alla locazione r,c") il ResultSet viene acceduto. E questo vuol dire che il ResultSet deve restare "aperto".

    Tu invece lo chiudi appena dopo il setup del table model.
  • Re: Popolare jTable da DB

    Scusami, non ci ho pensato a postare il codice, credevo che l'errore stesse tra le mie righe

    Ecco il codice di DBTableModel:
    
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import javax.swing.table.AbstractTableModel;
    
    public class DBTableModel extends AbstractTableModel {
    
       private ResultSet rs; // Resultset su cui si basa il modello
    
       /**
        * Creates a new instance of DBTableModel.
        */
       public DBTableModel() {
          super();
       }
    
       /**
        * Crea una nuova istanza di DBTableModel.
        * 
        * @param r il ResultSet su cui basare il modello
        */
       public DBTableModel(ResultSet r) {
          super();
          rs = r;
       }
    
       /**
        * Imposta il Resultset su cui si basa il modello.
        * 
        * @param r il ResultSet su cui basare il modello
        */
       public void setRS(ResultSet r) {
          rs = r;
          //notifica a tutti i listners che la struttura della tabella è cambiata
          fireTableStructureChanged();
    
       }
    
       /**
        * Restituisce il nome di una colonna secondo i metadati del ResultSet.
        * 
        * @param col intero, indice di colonna
        * @return stringa, il nome della colonna
        */
       @Override
       public String getColumnName(int col) {
          col++;
          if (rs == null) {
             return "";
          }
          try {
             return rs.getMetaData().getColumnName(col);
          } catch (SQLException e) {
             System.out.println(e.getMessage());
             return "";
          }
       }
    
       /**
        * Naviga il ResultSet per determinare il numero di righe.
        * 
        * @return intero, numero di righe del modello
        */
       @Override
       public int getRowCount() {
          if (rs == null) {
             return 0;
          }
          try {
             int currentPosition, last;
             currentPosition = rs.getRow();
             rs.last();
             last = rs.getRow();
             rs.absolute(currentPosition);
             return last;
          } catch (/*
                   * SQL
                   */Exception e) {
             System.out.println(e.getMessage());
             return 0;
          }
       }
    
       /**
        * Determina il numero di colonne dai metadati del ResultSet
        * 
        * @return intero, numero di colonne
        */
       @Override
       public int getColumnCount() {
          if (rs == null) {
             return 0;
          }
          try {
             return rs.getMetaData().getColumnCount();
          } catch (/*
                   * SQL
                   */Exception e) {
             System.out.println(e.getMessage());
             return 0;
          }
       }
    
       /**
        * Restituisce il valore da mostrare in una cella, in base al ResultSet
        * @param row intero, indice di riga
        * @param col intero, indice di colonna
        * @return oggetto da mostrare nella cella (row,col)
        */
       @Override
       public Object getValueAt(int row, int col) {
          int currentPosition;
          Object ob;
          row++;
          col++;
          try {
             currentPosition = rs.getRow();
             rs.absolute(row);
             ob = rs.getObject(col);
             rs.absolute(currentPosition);
             return ob;
          } catch (SQLException e) {
             System.out.println(e.getMessage());
             return null;
          }
       }
    
       /**
        * Determina se una cella &egrave; modificabile. In questo modello si
        * &grave; scelto di non rendere direttamente modificabile nessuna cella.
        * 
        * @param row intero, indice di riga della cella
        * @param col intero, indice di colonna della cella
        * @return sempre false
        */
       @Override
       public boolean isCellEditable(int row, int col) {
          return false;
       }
    
       /**
        * Metodo di impostazione di un valore, ignorato a causa delle celle non
        * modificabili.
        * 
        * @param value il valore da (non) impostare
        * @param row riga
        * @param col colonna
        */
       @Override
       public void setValueAt(Object value, int row, int col) {
          //rowData[row][col] = value;
          //fireTableCellUpdated(row, col);
       }
    }
  • Re: Popolare jTable da DB

    lady5 ha scritto:


    credevo che l'errore stesse tra le mie righe
    Infatti è nel tuo codice.

    Ora è evidente, es. nel getValueAt:

    rs.absolute(row);
    ob = rs.getObject(col);

    Se anche dopo 2 minuti che hai la tabella visibile a video, ti metti a scrollare avanti e indietro, avvengono continue richieste al table model. Il ResultSet DEVE restare "aperto", perché deve essere usato dal "vivo" durante la vita della tabella.

    Tu invece lo chiudi immediatamente dopo il setup!
    modelTable = new DBTableModel(rset);
    jTable1.setModel(modelTable);
    modelTable.setRS(rset);
             
    rset.close();   // <--------------------
  • Re: Popolare jTable da DB

    andbin ha scritto:


    lady5 ha scritto:


    credevo che l'errore stesse tra le mie righe
    Infatti è nel tuo codice.

    Ora è evidente, es. nel getValueAt:

    rs.absolute(row);
    ob = rs.getObject(col);

    Se anche dopo 2 minuti che hai la tabella visibile a video, ti metti a scrollare avanti e indietro, avvengono continue richieste al table model. Il ResultSet DEVE restare "aperto", perché deve essere usato dal "vivo" durante la vita della tabella.

    Tu invece lo chiudi immediatamente dopo il setup!
    modelTable = new DBTableModel(rset);
    jTable1.setModel(modelTable);
    modelTable.setRS(rset);
             
    rset.close();   // <--------------------
    Tutto chiarissimo...ho commentato la chiusura...e la tabella si popola!!!
    Grazie infinite
Devi accedere o registrarti per scrivere nel forum
4 risposte