in
La comunità italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

JTable dinamica

Ultimo messaggio ricevuto il 19-09-2007 17.55 da duffimc. 2 risposta(e).
Pagina 1 di 1 (3 elemento/i)
Ordina messaggi: Precedente Successivo
  • 13-03-2006 1.17

    • Gabry79
    • Utente Top 150
    • Registrato il 08-07-2005
    • Messaggi 7

    JTable dinamica

    Salve, ho un problema con la JTable.

    All'interno della mia interfaccia grafica io creo una tabella con 1 sola riga.
    In seguito a degli eventi dovrei aggiungere dei dati alla tabella, quindi delle altre righe, ma non riesco a farlo.
    Il programma vuole il numero di righe impostato al momento dell'inizializzazione della tabella.Come fare?
    Spero di essere stata chiara.
    Grazie

    • Log
  • 13-03-2006 17.12 In risposta a

    • theFool
    • Utente Top 10
    • Registrato il 13-07-2005
    • Piacenza
    • Messaggi 127

    Smile [:)] Re: JTable dinamica

    Ciao,
    l'intero set di classi che compongono il framework Swing segue il pattern MVC (Model-View-Controller) ovvero una specifica tecnica di programmazione che richiede la suddivisione del software in questi tre elementi, al fine di facilitare la suddivisione delle competenze all'interno dell'applicazione.
    Tuttavia è altrettanto vero che il pattern MVC non è (specialmente agli inizi) di facile implementazione, sicchè è possibile lavorare senza seguirlo (seppur abbattendo drasticamente le peculiarità che Swing offre); ne è un esempio la classe JTable: è infatti possibile utilizzarla per visualizzare dati contenuti all'interno di strutture come matrici o vettori, ma sicuramente il modo migliore è l'uso dell'interfaccia TableModel (MVC).

    Tale interfaccia definisce i metodi che è necessario implementare per consentire alla tabella di recuperare le informazioni necessarie a run-time; in alternativa (scelta da preferirsi) puoi utlizzare la classe AbstractTableModel, che semplicemente offre un'implementazione minimale della predetta interfaccia, lasciandoti la necessità di ridefinire i seguenti metodi:
    - getColumnName
    - getColumnCount
    - getRowCount
    - getValueAt

    Credo che nessuna spiegazione sia più chiarificatrice di un esempio:

    import java.util.*;
    import javax.swing.table.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;

    class Persona {
     private String cognome,nome;
     
     Persona( String cognome, String nome )
     {
      this.cognome = cognome;
      this.nome = nome;
     }
     
     public String getCognome()
     {
      return cognome;
     }
     
     public String getNome()
     {
      return nome;
     }
    }


    class Persone extends AbstractTableModel {
     private Vector elenco = new Vector();
     
     Persone()
     {
      super();
     }
     
     void add( String cognome, String nome )
     {
      elenco.add( new Persona( cognome,nome ) );
     }
     
     public String getColumnName(int column)
     {
      if( column==0 ) {
       return "Cognome";
      } else {
       return "Nome";
      }
     }
     public int getColumnCount()
     {
      return 2;
     }
     public int getRowCount()
     {
      return elenco.size();
     }
     public Object getValueAt(int row, int column)
     {
      Persona p = (Persona)elenco.get(row);
      if( column==0 ) {
       return p.getCognome();
      } else {
       return p.getNome();
      }
     }
    }

    class elencoPersone extends JFrame {
     Persone tm = new Persone();
     JTextField txtNome = new JTextField(5);
     JTextField txtCognome = new JTextField(5);
     
     elencoPersone()
     {
      super( "Elenco amici" );
      setDefaultCloseOperation( EXIT_ON_CLOSE );
      setSize( 500,300 );
      setResizable( false );
      
      tm.add( "Alighieri","Dante" );
      tm.add( "Petrarca","Francesco" );

      
      JPanel pnl = new JPanel();
      pnl.setLayout( new BorderLayout() );
      pnl.add( new JScrollPane( new JTable( tm ) ) , BorderLayout.CENTER );
      
      JPanel pnlAggiunta = new JPanel();
      pnlAggiunta.add( new JLabel( "Cognome" ) );
      pnlAggiunta.add( txtCognome );
      pnlAggiunta.add( new JLabel( "Nome" ) );
      pnlAggiunta.add( txtNome );
      
      JButton btn = new JButton( "Aggiungi" );
      btn.addActionListener( new ActionListener() {
        public void actionPerformed( ActionEvent e ) {
         tm.add( txtCognome.getText() , txtNome.getText() );
         tm.fireTableDataChanged();
        }
       }
      );
      pnlAggiunta .add( btn );
      
      pnl.add( pnlAggiunta , BorderLayout.SOUTH );
      setContentPane( pnl );
      show();
     }
     
     public static void main( String arg[] )
     {
      new elencoPersone();
     }
    }

    In questo esempio ci sono 3 classi distinte:
    - Persona (ovvio!);
    - Persone (che estende AbstractTableModel e gestisce le modifiche alla struttra dati, il vettore elenco);
    - elencoPersone (che visualizza il modello Persone);

    I blocchi di codice in rosso sono quelli di maggior importanza, su di essi dovrai meditare... Hmm [^o)]

    Spero che ti possa essere d'aiuto per la crescita nel linguaggio Java, nonchè spunto per approfondire l'argomento MVC. Wink [;)]

     

    Ciao ciao

    • Log
  • 19-09-2007 17.55 In risposta a

    • duffimc
    • Non Valutato
    • Registrato il 18-09-2007
    • Messaggi 1

    Re: JTable dinamica

    theFool:

    (scelta da preferirsi) puoi utlizzare la classe AbstractTableModel, che semplicemente offre un'implementazione minimale della predetta interfaccia, lasciandoti la necessità di ridefinire i seguenti metodi:
    - getColumnName
    - getColumnCount
    - getRowCount
    - getValueAt



    Ciao..
    Ho seguito il tuo codice di esempio e finalmente sono riuscito a collegare alla jtable al database...quindi gia ti ringrazio...:)
    Avrei pero bisogno di un'altro aiuto.
    il metodo add l'ho implementato in questo modo

    void add(ResultSet rs)
     {
         elenco.add( new CapoAbbigliamento(rs) );
     }

    e getValueat cosi:

    public Object getValueAt(int row, int column)
     {
         CapoAbbigliamento p = (CapoAbbigliamento) elenco.get(row);
         Object value = null;
        
         switch (column){
             case 0:
                 value = p.getTaglie(); //restituisce la taglia
                 break;
             case 1:
                 value = p.getQuantita(); //restituiscie la quantita della taglia
                 break;
             case 2:
                 value = p.getPrezzoAcquisto(); //restituiscie la quantita della taglia
                 break;
             case 3:
                 value = p.getPrezzo(); //restituiscie la quantita della taglia
                 break;
             case 4:
                 value = p.getPercRicarico(); //restituiscie la quantita della taglia
                 break;
             case 5:
                 value = p.getColori(); //restituiscie la quantita della taglia
                 break;
         }
      return value;
      }

    Ora vorrei permettere all'utente di modificare i dati presenti nella jtable quindi devo implementare il metodo setVauleAt giustoo???? (correggetemi se sbaglio è la prima volta che mi trovo ad operare con i tablemodel)
    Ho implementato questo metodo cosi:

     public void setValueAt(Object value, int row, int col) {
                  switch (col){
                     case 0:
                         elenco.add(value));
                         fireTableCellUpdated(row, col);
                         break;
                     case 1:

                         break;
                     case 2:

                         break;
                     case 3:

                         break;
                     case 4:

                         break;
                     case 5:

                         break;
                 }
    }

    Solo che appena provo a fare qualche modifica mi viene lanciata l'eccezione
    java.lang.ClassCastException all'interno del metodo getValueAt precisamente qui:

    CapoAbbigliamento p = (CapoAbbigliamento) elenco.get(row);

    Sinceramente non riesco a capire l'errore...anche se credo sia dovuto a elenco.add(value) forse...ma non riesco a capire come effettuare la modifica...
    Grazie per l'attenzione...

    duffimc


    • Log
Pagina 1 di 1 (3 elemento/i)
Prelevato da http://www.devspy.com/forums/t/4113.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"