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! ;-)
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!
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
si si penso di aver capito!
grazie ancora!!
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??
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! :)