Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35

    [JAVA] Inserimento dati rilevati in una JTable

    ciao a tutti.
    Sto cercando di realizzare un programma che riconosca i valori di un accellerometro e li inserisca in un grafico!
    Fin qui tutto procede bene, ora vorrei inserire i valori campionati in una JTable, ma non riesco ad inserirli.
    Qui ho postato solo la parte di codice relativa al problema.
    codice:
        private class DatiRilevati  {
            public long tempo;
            public double gvalue;
    
            public DatiRilevati(long tempo, double gvalue) {
                this.tempo = tempo;
                          this.gvalue = gvalue;
            }
    
           
        }
         private ArrayList<DatiRilevati> datiArray = new ArrayList<DatiRilevati>();
    
        private AbstractTableModel tmod = new AbstractTableModel() {
            private String colName[] = {"Tempo", "G-value" };
            public String getColumnName(int col) {
                return colName[col];
            }
            public int getRowCount() {
                return datiArray.size();
            }
            public int getColumnCount() {
                return 2;
            }
            public Object getValueAt(int row, int col) {
                DatiRilevati data = datiArray.get(datiArray.size() - row - 1);
                return (col == 0) ? data.tempo :
                       data.gvalue ;
    
                             }
    
            public boolean isCellEditable(int row, int col) {
                return false;
            }
              public Class getColumnClass(int c) {
              return (c == 0) ? Long.class : Double.class;
            }
        };
    Qui vi posto la parte di codice necessaria quando viene premuto il pulsante per l'inserimento dei dati raccolti nella tabella.
    codice:
        private void recordButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
           int i=0;
     int j= graphView.getSampleTime();
     int k=graphView.getIndexMax();
     System.out.println(j);
     System.out.println(k);
            while(i<k){
                     datiArray.add(new DatiRilevati(graphView.getTime(i), graphView.getGvalue(i)));
       
            i=i+j;
            System.out.print(graphView.getTime(i));
            System.out.println("  "+graphView.getGvalue(i));
            }
            readyRecord = false;
            recordButton.setEnabled(false); 
     
    }
    Ho provato a verificare con i due System.out.println(graphView.getTime(i)) e System.out.println(graphView.getGValue(i)) se i valori erano corretti ed effettivamente son giusti, quindi è proprio un problema di inserimento dei dati nella tabella.
    Vi prego aiutatemi!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Inserimento dati rilevati in una JTable

    Originariamente inviato da spier86
    quindi è proprio un problema di inserimento dei dati nella tabella.
    Alt, la questione è la seguente. Tu vai ad aggiungere dati nel datiArray con il add(). Il tuo table model è vero che "espone" i dati e le varie informazioni tramite tutti i vari getXXX() ... ma questo non vuol dire che tutto si aggiorna automaticamente. La "view" ovvero in questo caso la parte visuale della tabella non "sa" nulla del fatto che tu hai aggiornato una struttura dati.
    È invece il tuo table che deve "notificare" la view dicendo "ehi, guarda che qualcosa è cambiato nel model ... aggiornati!". E questo lo si fa da AbstractTableModel usando i suoi fireXXX().

    La cosa più semplice da fare per risolvere velocemente è invocare tmod.fireTableDataChanged() dopo quel ciclo delle add(). Ma così non sarebbe affatto bello e nemmeno "pulito".

    Per farlo bene e in modo "pulito" dovresti fare una bella classe apposita per il tuo table model, che contiene la struttura dati (va benissimo un ArrayList<DatiRilevati> ma che sia appunto dentro il model) e poi oltre ai metodi per soddisfare la interfaccia TableModel offrire un metodo tuo in più es. aggiungiDatiRilevati(DatiRilevati dati) che aggiorna la struttura dati e notifica i listener dell'aggiunta di una riga con fireTableRowsInserted().
    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
    Jun 2007
    Messaggi
    35
    Grazie mille per avermi risposto subito...
    Scusami ma sono un pò ignorante!non ho capito cosa vuol dire che la mia ArrayList<Dati Rilevati> debba essere dentro il model!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da spier86
    non ho capito cosa vuol dire che la mia ArrayList<Dati Rilevati> debba essere dentro il model!
    Molto molto abbozzato (ehm ... completalo tu ):

    codice:
    public class DatiRilevatiTableModel extends AbstractTableModel {
        private ArrayList<DatiRilevati> datiArray;    // <---- Il table model ha la collezione
    
        public DatiRilevatiTableModel() {
            datiArray = new ArrayList<DatiRilevati>();
        }
    
        // .... altri metodi per esporre dati/informazioni secondo TableModel ....
    
    
        // .... Metodi "tuoi" per agire sul table model, per es.:
    
        public void aggiungiDatiRilevati(DatiRilevati dati) {
            // .... aggiungi alla lista
            // .... notifica l'inserimento di una nuova riga
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35
    Scusami ancora!ma non riesco a capire... in aggiungiDatiRilevati(DatiRilevati dati) dovrei metterci il metodo:
    codice:
               int i=0;
     int j= graphView.getSampleTime();
     int k=graphView.getIndexMax();
     System.out.println(j);
     System.out.println(k);
            while(i<k){
                  
    
        datiArray.add(new DatiRilevati(graphView.getTime(i), graphView.getGvalue(i)));
    
            i=i+j;
            }
    mentre in recordButtonActionPerformed devo solo andare a chiamare il metodo aggiungiDatiRilevati???

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da spier86
    Scusami ancora!ma non riesco a capire... in aggiungiDatiRilevati(DatiRilevati dati) dovrei metterci il metodo:
    No. in aggiungiDatiRilevati() devi solo aggiungere l'oggetto nella lista e notificare con uno dei fireXXX (nel caso di inserimento di 1 riga è logico usare fireTableRowsInserted() ).

    Originariamente inviato da spier86
    codice:
    datiArray.add(new DatiRilevati(graphView.getTime(i), graphView.getGvalue(i)));
    Invece di fare questo farai:

    tuoTableModel.aggiungiDatiRilevati(new DatiRilevati(......));

    Lo vedi come si è spostata la gestione della lista? Invece di farla esternamente al model (che non "sa" nulla di cosa hai fatto), la fa il model stesso, che quindi solo lui ha il controllo e sa cosa hai chiesto di fare.

    Originariamente inviato da spier86
    mentre in recordButtonActionPerformed devo solo andare a chiamare il metodo aggiungiDatiRilevati???
    No, in recordButtonActionPerformed continuerai a fare quelle operazioni con quel ciclo while ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    35
    Ho provato a fare come dici tu...ma nella tabella non visualizzo nulla lo stesso...
    codice:
             ArrayList<DatiRilevati> datiArray = new ArrayList<DatiRilevati>();
     DatiRilevatiTableModel drtm= new DatiRilevatiTableModel(datiArray);
     
    public class DatiRilevatiTableModel extends AbstractTableModel {
        private ArrayList<DatiRilevati> datiArray;    // <---- Il table model ha la collezione
    
        public DatiRilevatiTableModel(ArrayList<DatiRilevati> datiArray) {
            this.datiArray=datiArray;
    
    
        }
    
    
        public void aggiungiDatiRilevati(DatiRilevati dati) {
    datiArray.add(dati);
    int row = datiArray.size()-1;
    fireTableRowsInserted(row,row);
    
        }
    
             private String colName[] = {"Tempo", "G-value" };
            public String getColumnName(int col) {
                return colName[col];
            }
            public int getRowCount() {
                return datiArray.size();
            }
            public int getColumnCount() {
                return 2;
            }
            public Object getValueAt(int row, int col) {
                DatiRilevati data = datiArray.get(datiArray.size() - row - 1);
                return (col == 0) ? data.tempo :
                       data.gvalue ;
    
                             }
    
            public boolean isCellEditable(int row, int col) {
                return false;
            }
    
              public Class getColumnClass(int c) {
              return (c == 0) ? Long.class : Double.class;
            }
    }
    
    
    
    
        private class DatiRilevati  {
            public long tempo;
            public double gvalue;
    
            public DatiRilevati(long tempo, double gvalue) {
                this.tempo = tempo;
                          this.gvalue = gvalue;
            }
    
        }
    qui c'è la parte di codice relativa a recordButtonActionPerformed

    codice:
            int i=0;
     int j= graphView.getSampleTime();
     int k=graphView.getIndexMax();
     System.out.println(j);
     System.out.println(k);
            while(i<k){
    
    DatiRilevati dr= new DatiRilevati(graphView.getTime(i),graphView.getGvalue(i));
        datiArray.add(dr);
     drtm.aggiungiDatiRilevati(dr);
    
            i=i+j;
            }
            readyRecord = false;
            recordButton.setEnabled(false);

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.