Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problema refresh e selezione jTable

    Buonasera a tutti,
    sono nuova del forum (e anche delle applicazioni java che implichino l'utilizzo di jframe o di connessioni a database). Sto sviluppando una applicazione desktop in netbeans, e ho qualche problema con una jTable. In pratica io ho implementato un mio TableModel per accogliere i dati di un ResultSet proveniente da un database; la mia connessione in questo caso è in sola lettura. Quando aggiungo un nuovo record io voglio che la mia tabella venga aggiornata (il nuovo record viene inserito nel database con un'altra connessione fatta tramite persistence ed entity Manager), e così ho creato nel mio TableModel un metodo che modifichi il ResultSet e che segnali i cambiamenti a tutti i listener tramite il metodo fireTableDataChanged(). Il tutto funziona perfettamente, tranne che nel caso in cui nella tabella ci sia una riga selezionata; in particolare se c'è una riga selezionata, quando spingo sul bottone del nuovo record, e cerco di effettuare una qualsiasi operazione sulla tabella (che sia il metodo fireTableDataChanged() o che sia un clearSelection()) mi lancia una eccezione "java.sql.SQLException: Cannot absolute position to row 0". Ho fatto un debug e l'eccezione è lanciata dalla classe EventDispatchThread, metodo pumpOneEventForFilters. E' piuttosto frustrante perchè non ho davvero idea di dove sia il problema; voglio dire, perchè la selezione di una riga dovrebbe influenzare l'aggiornamento della tabella?

    Ogni aiuto è bene accetto!
    Grazie mille

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Perchè è tutto controllato dal Model.

    Comunque se non posti del codice è difficile esserti d'aiuto

  3. #3
    Innanzitutto grazie per la risposta.
    Il codice del mio modello è il seguente:

    codice:
    public class ResSetTableModel extends AbstractTableModel {
    
        private ResultSet rs;
        private ResultSetMetaData rsmd;
    
        public ResSetTableModel(ResultSet newRS) {
            rs=newRS;
            try {
                rsmd=newRS.getMetaData();
            } catch (SQLException e){
                e.printStackTrace();
            }
        }
    
        public int getColumnCount() {
            try{
                return rsmd.getColumnCount();
            } catch (SQLException e) {
                e.printStackTrace();
                return 0;
            }
        }
    
        @Override
        public String getColumnName(int c) {
            try {
                return rsmd.getColumnName(c + 1);
            }
            catch(SQLException e) {
                System.out.println("Error " + e);
                return "";
          }
       }
    
        public void updateTable(ResultSet rs) {
            this.setResultSet(rs);
            this.fireTableDataChanged();
        }
    
      protected ResultSet getResultSet() {
         return rs;
      }
    
      public void setResultSet(ResultSet res) {
          this.rs=res;
          try {
            this.rsmd=res.getMetaData();
          } catch(SQLException e) {e.printStackTrace(); }
      }
    
      public int getRowCount() {
           try {
              rs.last();
              return rs.getRow();
           } catch(SQLException e){
               e.printStackTrace();
               return 0;
           }
      }
    
      public Object getValueAt(int row, int col) {
          try {
              rs.absolute(row+1);
              return rs.getObject(col+1);
          } catch (SQLException e) {
              e.printStackTrace();
              return null;
          }
      }
    }
    e il codice che riguarda l'aggiunta del nuovo record è questo:
    codice:
     public void newRecord() {
          
                Linee l=new Linee();
                JavaApplication5PUEntityManager.persist(l);
                JavaApplication5PUEntityManager.getTransaction().commit();
                JavaApplication5PUEntityManager.clear();
                JavaApplication5PUEntityManager.getTransaction().begin();
                try {
                    rs=ps.executeQuery();
                } catch(SQLException e) {}
    
                model.updateTable(rs);
     
                Linee ll=JavaApplication5PUEntityManager.find(Linee.class, l.getIDlin());
                setCurrentRecord(ll);
                setNuovo(true);            
    
            }
    dove rs è un ResultSet ed è una variabile globale, stessa cosa per ps che è un PreparedStatement.
    Ribadisco che sono totalmente nuova a questi argomenti, perciò non faccio fatica a credere che ci sia un errore grossolano da qualche parte..
    Grazie mille per l'aiuto

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ma in questo modo non puoi effettuare update sulla tabella...dov'è l'array contenente gli elementi della tabella?

    Guarda com'è composto:
    http://download.oracle.com/javase/tu...able.html#data

  5. #5
    Io non ho un array contenente i dati, la mia struttura dati è direttamente il ResultSet. Quindi quando voglio fare update semplicemente mi ricalcolo il ResultSet dal database e lo metto dentro al mio modello.
    In realtà funziona tutto bene, la tabella si aggiorna bene, sorgeva solo un problema nel caso in cui io tentassi di richiamare il metodo fireDataTableChanged quando c'era una riga della tabella già selezionata.. Ora l'ho risolto, ho fatto un debug accurato e mi sono resa conto che (non ho idea del motivo) se una riga era selezionata il metodo fireDataTableChanged ad un certo punto richiamava il metodo getValueAt del mio modello con row=-1, e quindi mi dava l'errore che il resultset non poteva essere puntato alla riga 0 (perchè i resultset partono dalla riga 1). E' bastato aggiungere un controllo nel metodo getValueAt in cui dico che se la riga è maggiore di -1 deve eseguire normalmente il codice, altrimenti deve restituire null. In questo modo, aggiungendo anche controlli sul null nei metodi seguenti, funziona tutto bene e non mi da più eccezioni...
    Non so se mi sono spiegata, è complicato spiegare le cose scrivendole :P
    Grazie comunque dell'aiuto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.