Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260

    Aggiornare a runtime un JTable con dati da Database

    Ho creato una gestione di una rubrica telefonica con la GUI in Java e mi ritrovo ad avere il problema in titolo.
    Praticamente ho una classe che estende AbstractTableModel e questa viene inserita in una JTable che a sua volta viene inserita in uno JScrollPane.

    Ho girato in lungo e in largo su internet ma non riesco a capire come risolvere l'aggiornamento automatico della tabella.
    Esistono dei metodi in particolare o una discussione o un tutorial su internet dove è spiegato bene?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fix87 Visualizza il messaggio
    ho una classe che estende AbstractTableModel
    non riesco a capire come risolvere l'aggiornamento automatico della tabella.
    Hai detto che hai esteso AbstractTableModel, quindi immagino che hai creato un "tuo" table model personalizzato con una tua struttura dati. Quale? List<TuoTipo> ? TuoTipo[] ? Altro?

    Se hai esteso AbstractTableModel, come minimo devi aver fornito i metodi che "espongono" i dati. Questo serve per soddisfare la interfaccia TableModel. Ma per modificare il contenuto del table model non c'è uno "standard", né a livello concettuale né a livello di "contratto" di qualche interfaccia.
    Se un table model deve poter aggiornare i dati, deve offrire in modo "custom" una serie di metodi aggiuntivi tipo es. add, remove, removeAll o con qualunque altro nome. Sono cioè metodi specifici che ovviamente devono essere conosciuti dal codice "client" che usa la classe specifica del table model.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Hai detto che hai esteso AbstractTableModel, quindi immagino che hai creato un "tuo" table model personalizzato con una tua struttura dati. Quale? List<TuoTipo> ? TuoTipo[] ? Altro?
    Allora per il momento ho semplicemente un array bidimensionale di String che contiene i dati della tabella quindi ho semplicemente un array Strin[][] dati.
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se hai esteso AbstractTableModel, come minimo devi aver fornito i metodi che "espongono" i dati. Questo serve per soddisfare la interfaccia TableModel. Ma per modificare il contenuto del table model non c'è uno "standard", né a livello concettuale né a livello di "contratto" di qualche interfaccia.
    Se un table model deve poter aggiornare i dati, deve offrire in modo "custom" una serie di metodi aggiuntivi tipo es. add, remove, removeAll o con qualunque altro nome. Sono cioè metodi specifici che ovviamente devono essere conosciuti dal codice "client" che usa la classe specifica del table model.
    Faccio prima a riportare il codice relativo alla classe Tabella che estende AbstractTableModel
    codice:
    public class Tabella extends AbstractTableModel{
       private Database db = Database.getDatabase(); //Database è una classe singleton
       private ResultSet rs;
       private int rowsNumber = 0;
       private String attributi[] = {"Cognome","Nome","Telefono 1","Telefono 2","Email"};
       private String dati[][];
    
       public Tabella(){
          numeroRighe();
          dati = new String[rowsNumber][attributi.length];
          riempiTabella();
       }
       
       private void numeroRighe(){
          try{
             rs = db.interaRubrica(); //interaRubrica ritorna il risultato di una SELECT * FROM contatti
             while(rs.next()){
                rowsNumber++; //Siccome SQLite non posso tornare indietro con il puntatore e mi tocca calcolare prima il numero di righe
             }
          }
          catch(SQLException e){
             //Messaggio d'errore
          }
       }
    
       private void riempiTabella(){
          try{
             rs = db.interaRubirca();
             while(rs.next()){
                dati[i][0] = rs.getString("Cognome");
                dati[i][1] = rs.getString("Nome");
                dati[i][2] = rs.getString("Telefono1");
                dati[i][3] = rs.getString("Telefono2");
                dati[i][4] = rs.getString("Email");
                i++;
             }
          }
          catch(SQLException e){
            //Messaggio d'errore
          }
       }
    
       public String getColumnName(int column){
          return attributi[column]; //Questo metodo l'ho implementato per sapere il nome degli attributi delle colonne
       }
    
       public int getColumnCount(){
          return attributi.length;
       }
       
       public int getRowCount(){
          return dati.length;
       }
    
       public Object getValueAt(int row, int col){
          return (String) dati[row][col];
       }
    }
    Questo è il codice che ho implementato per costruire la "Tabella Custom"

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Possibile che abbia trovato la soluzione?
    Praticamente nel codice dell'interfaccia grafica e più precisamente quando clicco il bottone per eliminare o aggiungere un contatto ho inserito le due righe di codice seguenti:
    codice:
    tabella = new Tabella();
    table.setModel(tabella);
    table sarebbe la JTable().

    Possibile che bastava l'istruzione table.setModel(tabella) per far funzinaare il tutto?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fix87 Visualizza il messaggio
    Possibile che bastava l'istruzione table.setModel(tabella) per far funzinaare il tutto?
    Sì, certo che così funziona ed è tecnicamente corretto ma ..... così reimposti totalmente un nuovo table model. A parte che in questo modo JTable ha un pochino di lavoro "tecnico" in più da fare (non è un problema di tempo comunque ... è ininfluente) ma così perdi delle cose. Sicuramente viene persa la "selezione" e pure la eventuale larghezza delle colonne che l'utente può aver ridimensionato a mano.
    Nulla di grave di per sé ma è bene che lo sai. E se ti va bene ..... ok.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sì, certo che così funziona ed è tecnicamente corretto ma ..... così reimposti totalmente un nuovo table model. A parte che in questo modo JTable ha un pochino di lavoro "tecnico" in più da fare (non è un problema di tempo comunque ... è ininfluente) ma così perdi delle cose. Sicuramente viene persa la "selezione" e pure la eventuale larghezza delle colonne che l'utente può aver ridimensionato a mano.
    Nulla di grave di per sé ma è bene che lo sai. E se ti va bene ..... ok.
    Per quanto riguarda la larghezza delle colonne l'ho impostata fissa che non si può spostare e per quanto riguarda la selezione, mi fa selezionare i contatti appena aggiungerli e cancellarli se voglio.
    Però ovviamente se creerò una tabella in cui la larghezza è modificabile come dovrei procedere per lavorare sempre sulla stessa TableModel?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fix87 Visualizza il messaggio
    Però ovviamente se creerò una tabella in cui la larghezza è modificabile come dovrei procedere per lavorare sempre sulla stessa TableModel?
    Cambiando i dati all'interno del table model ..... non cambiando istanza del table model. E questo vuol dire che devi rendere "mutabile" il tuo table model anche dopo che è stato istanziato. E che devi anche usare (almeno) uno dei vari metodi fireXXX forniti da AbstractTableModel (se cambi tutti i dati, allora è fireTableDataChanged() ).

    P.S. guarda questa discussione in cui LeleFT ha ripescato un mio post con un esempio di table model. Giusto per farti una idea (il mio esempio era un po' diverso dalle tue necessità).
    Ultima modifica di andbin; 10-04-2014 a 16:04
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Ti ringrazio per quel prezioso link che ho messo tra i preferiti

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.