Riempire dinamicamente una jTable in Java

Ultimamente sto utilizzando intensamente Java per lavoro. Sto realizzando un gestionale abbastanza corposo, dove ho potuto sperimentare diverse cose interessanti.

Nel disegnare le interfacce, uno degli oggetti che sto trovando sempre più utile, è la jTable, nient’altro che una semplice tabella (la vecchia DataGrid di visual basic). Inizialmente avevo trovato un po’ ostico capire come funzionasse, nonostante ci fossero parecchi esempi che danno molti consigli su come usarle. Una delle pagine di esempi più complete è questa sul sito oracle.

Voglio però spendere qualche riga per spiegare come poter facilmente caricare una jTable leggendo i dati da un resultset o da un elenco qualsiasi.

Penso che il concetto più semplice per utilizzare al meglio le jTable sia implementare una List<T> (dove T può essere un array di Object o di String o una vostra classe personale, fate voi) con una ArrayList o una LinkedList. Questa lista terrà aggiornata la jTable.

Personalmente creo sempre un metodo che chiamo “refreshTable” che legge i dati dalla lista e li inserisce nella tabella. Il metodo non farà altro che usare un iteratore per scorrere la lista e creare una matrice di Object da passare alla nostra jTable per riempirla.

        //Creo array di intestazioni
        String [] headers=this.getTableHeaders();
        //Creo matrice di dati
        Object[][] data=new Object[this.lista.size()][headers.length];
        int i=0;
        for(Iterator<String[]> it=lista.iterator();it.hasNext();){
            String[] tmp=it.next();
            for(int j=0;j<tmp.length;j++){
                data[i][j]=tmp[j];
            }
            i++;
        }
        //Setto dati e intestazioni della tabella
        this.myJTable.setModel(new javax.swing.table.DefaultTableModel(data, headers){@Override public boolean isCellEditable(int rowIndex, int mColIndex) { return false; }});
        //Setto larghezza colonne
        this.setTableCellsSize(this.myJTable);
        //Imposto allinamento delle celle al centro
        DefaultTableCellRenderer renderer=new DefaultTableCellRenderer();
        renderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        this.myJTable.setDefaultRenderer(this.myJTable.getColumnClass(0), renderer);
        this.myJTable.updateUI();

Così facendo abbia riempito la nostra jTable. Il metodo che fa ciò è il setModel(), al quale io passo sempre una matrice di Object che contiene i dati veri e propri e un array di String che contiene le intestazioni della tabella (che leggo dal mio metodo this.getTableHeaders() ). Oltre a questo ho creato un metodo (this.setTableCellsSize() ) che imposta la larghezza delle varie colonne della tabella:

        int prefWidth=(this.getWidth()/2)/(this.getHeadersTable()).length;
        tbl.setAutoResizeMode(jTable.AUTO_RESIZE_OFF);

        tbl.getColumnModel().getColumn(0).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(1).setPreferredWidth(prefWidth+100);
        tbl.getColumnModel().getColumn(2).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(3).setPreferredWidth(prefWidth-30);
        tbl.getColumnModel().getColumn(4).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(5).setPreferredWidth(prefWidth+20);
        tbl.getColumnModel().getColumn(6).setPreferredWidth(prefWidth-20);
        tbl.getColumnModel().getColumn(7).setPreferredWidth(prefWidth+20);

Nelle ultime righe ho invece dichiarato un Renderer per settare l’allineamento al centro delle celle della jTable.

Prestate attenzione alla linea dove viene eseguita la setModel(): qui ho riscritto il metodo isCellEditable, in modo che restituisca sempre false. Così facendo qualsiasi cella della nostra jTable non potrà essere editata.

Se vi servissero esempi più dettagliati (ad esempio per inserire delle checkbox in una delle colonne o per aprire menu al pressione del tasto destro del mouse sulla tabella) fate un fischio! ;-)

9 Risposte a “Riempire dinamicamente una jTable in Java”

  1. matteo ha detto:

    ciao!
    complimenti, l’articolo è scritto molto bene.
    in effetti io sto cercando proprio un modo per avere una colonna formata da checkox, ma nn riesco a capire bene come si fa.
    te hai qualche codice da passarmi??
    grazie!

    • davide ha detto:

      Ciao Matteo, grazie per i complimenti fanno sempre piacere :)
      Per quanto riguarda invece la tua domanda la cosa si fa un po’ complicata, mi spiego: per gestire i dati di una jTable viene usata una classe generica (AbstractTableModel) che tratta i dati come stringhe. Per fare quello che vuoi tu, dovresti scriverti una piccola classe che implementi l’interfaccia TableModel. In questo modo credo che si debba implementare il metodo getColumnClass in modo che ritorni il tipo di dato della cella in questione, al posto di String. Spero di essermi riuscito a spiegare, in ogni caso puoi trovare ciò che ti interessa qui: Guida jTable di Oracle

  2. fermat ha detto:

    si si penso di aver capito!
    grazie ancora!!

  3. christian ha detto:

    ciao è interessante il fatto di creare una tabella, xò mi riusciresti a dare una mano in questa cosa??

    io ho creato il frame con 9 bottoni, e il primo quello crea, vorrei che mi creasse una tabella, come posso fare??

    • davide ha detto:

      Se tu usassi un IDE (ad esempio NetBeans), hai a disposizione degli strumenti per disegnare le interfacce grafiche delle tue applicazioni e per assegnare delle azioni ai pulsanti. In questo modo potresti creare un JPanel in cui al click sul pulsante crea vai ad inserire la tua tabella.
      Non so se sia la soluzione migliore, ma credo possa funzionare! :)

  4. Ale ha detto:

    Ciao, potresti postare o inviarmi via mail il codice dove creii la lista e il metodo refresh? sono alle prime armi e non riesco a seguire il codice che hai postato…
    Nel caso ti ringrazio in anticipo e ti faccio i miei complimenti.

  5. Natalia ha detto:

    Si mi piacerebbe far comparire un menu al click di una riga della tabella.

    grazie mille!

  6. gibbo ha detto:

    invece io devo inserire oggetti di una classe film dentro la tabella e ho provato a modificare il tuo esempio ma purtroppo non ci sn riuscito

Lascia un commento