|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
[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!
|
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
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
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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 Codice:
int rigaCorrente = model.getRowCount() - 1;
for(int c = 0; c < model.getColumnCount(); c++) {
Object valore = resultSet.getObject(c);
model.setValueAt(valore, rigaCorrente, c);
}
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
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 |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
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!
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il valore nelle righe lo metti con setValueAt(valore, riga, colonna) quando cicli sul result set.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
Ho capito... ma ancora non mi funziona.. ti posto il codice:
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);
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
Mi stampa le righe vuote e va in eccezione quindi non entra neanche nel ciclo... Mamma mia... che devo fare?
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
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...
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
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...
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Prova così:
Codice:
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);
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
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.... |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
I effetti ho messo un "rs.last()" al posto di "rs.next()" (cambia la condizione del while)
Whops.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 54
|
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
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:03.



















