PDA

View Full Version : [java - jdbc] Usare una JTable per mettere i risultati di una query


salim
10-10-2009, 17:29
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:

salim
10-10-2009, 17:50
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 :)

PGI-Bis
10-10-2009, 18:08
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.

salim
11-10-2009, 16:38
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:

salim
11-10-2009, 16:47
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!

PGI-Bis
11-10-2009, 16:50
Il valore nelle righe lo metti con setValueAt(valore, riga, colonna) quando cicli sul result set.

salim
11-10-2009, 17:11
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:

PGI-Bis
11-10-2009, 17:20
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.

salim
11-10-2009, 17:27
Mi stampa le righe vuote e va in eccezione quindi non entra neanche nel ciclo... Mamma mia... che devo fare?

salim
11-10-2009, 17:30
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... :(

salim
11-10-2009, 17:35
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:

PGI-Bis
11-10-2009, 17:37
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.

salim
11-10-2009, 18:00
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!

PGI-Bis
11-10-2009, 18:01
I effetti ho messo un "rs.last()" al posto di "rs.next()" (cambia la condizione del while)

Whops.

salim
12-10-2009, 15:24
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 :)