View Full Version : [java - jdbc] Usare una JTable per mettere i risultati di una query
Salve a tutti! Praticamente come da titolo... ho provato in mille modi con la JTable e la AbstractTableModel ma niente di fatto.
Io uso uno classe che estende la classe JFrame, nella quale è presente una tabella che dovrebbe visualizzare i risultati di una query appena questa viene lanciata. I risultati di questa query sono le anagrafiche di persone. Spero in un vostro aiuto.... Grazie! :help:
in altre parole vorrei sapere come riempire la matrice delle righe, visto che il costruttore della JTable prende come parametri un doppio array di righe e un array di colonne. Attendo una vostra risposta :)
Quando vedi un array, scappa. Quando è doppio, raddoppia la velocità di fuga.
JTable ha un costruttore più utile, quello che prende un TableModel.
Dei TableModel quello che interessa il non masochista è DefaultTableModel.
Fai la query, poi:
1. crei un DefaultTableModel
DefaultTableModel model = new DefaultTableModel();
2. in base alle colonne del result set imposti le colonne del model
model.setColumnCount(XYZ);
3. inizi a scorrere il result set. Per ogni riga del risultato aggiungi una riga vuota al modello:
model.setRowCount(model.getRowCount() + 1);
e popoli quella riga con il metodo setValueAt
int rigaCorrente = model.getRowCount() - 1;
for(int c = 0; c < model.getColumnCount(); c++) {
Object valore = resultSet.getObject(c);
model.setValueAt(valore, rigaCorrente, c);
}
Alla fine passi il modello alla tabella:
tabella.setModel(model);
o crei la nuova tabella con quel modello:
tabella = new JTable(model);
Dipende se la tabella c'è già o no.
E' un procedimento che puoi eseguire in parallelo rispetto al thread che gestisce l'interfaccia utente, ad esempio con uno SwingWorker.
ok! Il tuo metodo funziona.. solo che mi fa apparire come colonne le lettere dell'alfabeto anzicchè quello che voglio io (cognome, nome, ecc.) e poi io volevo visualizzare i risultati di una query SELECT anzicchè le righe vuote come hai specificato.
Sai come posso ovviare a questi due problemi? Grazie e scusa per il disturbo :mc:
il primo problema è risolto... quello delle colonne, usando il metodo setColumnIdentifiers(arraydicolonne), mi manca come popolare la tabella con i risultati di una query.. Spero di ricevere tue notizie al più presto!
Il valore nelle righe lo metti con setValueAt(valore, riga, colonna) quando cicli sul result set.
Ho capito... ma ancora non mi funziona.. ti posto il codice:
db = new DB(); //classe con la quale mi connetto al mio database.
String tutti = getQueryTutti(); //restituisce la mia query
try{
defaultmodel = new DefaultTableModel();
defaultmodel.setColumnCount(colonne.length);
defaultmodel.setColumnIdentifiers(colonne);
ResultSet rs = db.selectQuery(tutti);
//Contimao le rige del RS
// int count = 0;
// while(!rs.isLast()){
// count++;
// rs.next();
// }
// rs.first(); //POSSO USARE UNO DEI DUE MODI
int count= 0;
while(rs.next()) {
count++;
defaultmodel.setRowCount(defaultmodel.getRowCount() + 1);
}
rs.first();
//int pazienteiesimo[] = new int[100];
int rigaCorrente = defaultmodel.getRowCount()-1;
for(int c = 0; c < defaultmodel.getColumnCount(); c++) {
Object valore = rs.getObject(c);
defaultmodel.setValueAt(valore, rigaCorrente, c);
}
tabellapazienti = new JTable(defaultmodel);
quello che non va è che mi visualizza le righe vuote anzicchè il contenuto della query.. :muro:
Quel codice riempie sola una riga, l'ultima. Ti basta poi un ciclo, non ne servono tre. Prova poi a stampare "valore" nel ciclo: magari non c'è nessun valore.
Mi stampa le righe vuote e va in eccezione quindi non entra neanche nel ciclo... Mamma mia... che devo fare?
da dire che l'ultima istruzione che è sbagliata è in realtà messa alla fine del catch.... per essere chiaro... per il resto c'è da dire che le JTable sono più complicate di quanto mi aspettavo... :(
ho fatto il debug manuale hehe con il println e mi accorgo che tutto va bene fino al ciclo dove c'è il setValueAt, che non mi stampa il valore. Hai qualche soluzione e scusami per il disturbo... ma è importante... :doh:
Prova così:
DefaultTableModel model = new DefaultTableModel();
int cMax = rs.getMetaData().getColumnCount();
model.setColumnCount(cMax);
while(rs.isLast()) {
int riga = model.getRowCount();
for(int c = 0; c < cMax; c++) {
model.setRowCount(model.getRowCount() + 1); //nuova riga
Object valore = rs.get(c);
model.setValueAt(valore, riga, c);
}
}
tabella.setModel(model);
L'ho scritto al volo ma dovrebbe essere giusto.
ok Grazie! Ma è peggio di prima, così non mi visualizza neanche le righe vuote... cmq se non hai altre soluzioni... vedrò di sbatterci la testa un altro pò. Dovrei trovare la soluzione non è che è un problema di quelli pazzeschi....
se mi blocco qua.... sono finito.... :cry: Grazie ancora! Ciao!
I effetti ho messo un "rs.last()" al posto di "rs.next()" (cambia la condizione del while)
Whops.
Problema risolto.. tra vari tentantivi, il ciclo cmq era quelo... Ora però devo fare in modo di rendere tutte le celle editabili... ma questo è il pensiero minore :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.