Newsgroup: it.comp.java
Titolo: JTable... che casino?!?!?!?!

Non ho capito per niente come impostare una JTable in modo che possa
utilizzarla per visualizzare risultati di Query su un DB ... qualcuno ha un
esempio valido o un indirizzo internet da darmi?
Sui miei libri non c'è nessun esempio con la JTable e non è trattata come di
altri componenti Swing...che faccio?
Grazie.

 Sui miei libri non c'č nessun esempio con la JTable e non č trattata come


La prima cosa che devi assolutamente capire è che le JTable non memorizzano
i dati nel loro interno, ma delegano la memorizzazione di questi ad un
Model.
Molti componenti swing (forse tutti) fanno questo. In particolare JTree e
JTable obbligano l'uso di model.
Questo perché, la potenzialità è ovviamente enorme.
Difatti basta cambiare i dati del model, che in automatico questi si
ripercuotono sulla tabella e vice versa.
In più è possibile avere più model, basterà usare il metodo
setModel(myModel) della classe JTable per cambiare l'intero contenuto della
tua tabella. Il che non è mica poco.
Puoi o usare un DefaultTableModel che implementa l'interfaccia
AbstractTableModel, oppure crearti un tuo model implementando
quell'interfaccia.
In ambi i casi il concetto è quello di reperire dal tuo ResultSet una
struttura dati che può essere o un Vector o un array bidimensionale di
Oggetti.
Facciamo entrambi i casi :
1 - Nel caso del DefaultTableModel, una volta ottenuta la struttura dati
(Vector o Object[][]), la passi al costruttore della classe
DefaultTableModel, dopo di che passi l'istanza alla JTable
    es.
         /*
          * il metodo : "getDatiDB(ResultSet rs)" è quello che devi crearti
          * per prendere l'array di Object dal Result Set
          */
        Object datiDB[][] = getDatiDB(rs);
        JTable jt = new JTable();
        ...................
        ...................
        ...................
        DefaultTableModel model = new DefaultTableModel(datiDB)
        jt.setModel(model);
Una volta passato il model alla JTable i dati vengono visualizzati in
automatico.
La classe DefaultTableModel ti mette a disposizione un gran numero di
funzioni già belle e pronte, ma ci sono cose che spesso non vogliamo e che
da levare sono un dramma e soprattutto, deve esserci una corrispondenza tra
numero di colonne del DB e colonne della JTable, a meno che tu non filtri i
dati durante il recupero di essi dal ResultSet.
2 - Se vuoi implementarti da solo l'interfaccia AbstractTableModel, sappi
che ci sono dei metodi obbligatori, senza i quali non funziona nulla.
I metodi sono  :
        - getColumnCount()      : Informa la JTable del numero di colonne
che sono memorizzate nella tua struttura dati.
        - getRowCount()           : Il numero di righe della tua
StrutturaDati.
        - getValueAt(int r, int c) : Dovrà permettere alla JTable di
reperire i valori Riga - Colonna dalla tua struttura dati
Questo metodo è più complesso ma molto più efficace, perchè puoi definire un
metodo, ad esempio, che ti visualizza solo alcune colonne, senza
necessariamente avere una esatta corrispondenza tra struttura dati e JTable.
Importante è che se implementi i metodi per inserire o togliere delle righe
dal tuo model, per far si che vengano tolte direttamente anche sulla JTable,
aggiorna SEMPRE il valore delle variabile che utilizzi per memorizzare il
numero delle righe e delle colonne della tua struttura dati e poi lancia uno
dei metodi fireXXXXXXX, che servono appunto per aggiornare le informazioni
presenti sulla JTable.
Spero di essere stato abbastanza chiaro, comunque se hai altri dubbi
scrivimi pure direttamente.
santo...@ciaoweb.it

 Spero di essere stato abbastanza chiaro......
Veramente sei stato più chiaro di tanti testi dai quali ho cercato di
capire qualcosa a riguardo. Perchè non scrivi una guida su questi
argomenti? Sono sicuro che andrebbe a ruba, perchè, osservando anche
tanti altri post, non mi sembra di essere il solo che ha dei problemi
con le JTable.
Comunque mi rimane un dubbio fondamentale.
Dopo aver effettuato modifiche su un record attraverso la JTable, come
faccio ad aggiornare il DB? Devo per forza fare un lookup sulla
tabella per posizionarmi al punto giusto, o c'è qualcosa che mi tiene
legati la riga della JTable e il record della tabella?
Io ho usato (con JBuilder 4) le JdbTable che, se da questo punto di
vista sono eccezionali perchè la gestione dell'origine dati è del
tutto trasparente, lasciano decisamente a desiderare per le
possibilità di personalizzazione. O sono io che non le so usare?
Ciao a tutti

Ciao Peppe.
Diciamo che in questi giorni sto bestemmiando non poco con questi argomenti
e quindi ho tempo anche di rispondere a chi ha i miei stessi patemi.
Io uso VisualCafè e posso dirti che tutti gli automatismi che trovi alla
fine sono semplicemente un'implementazione degli strumenti base che mamma
SUN ci ha dato.
Per quello che riguarda il tuo problema, voglio precisare una cosa.
Allora, la JTable e il Model che memorizza i dati, sono direttamente
collegati. I dati che editi nella cella di testo, una volta convalidati
vengono spediti al model.
Che questi vengano poi memorizzati in esso dipende se il tuo Model
implementa il metodo setValueAt(int row, int column).
Se lo fai, in automatico la griglia quando sente l'evento :"CellValidate"
chiama questo metodo.
Di fatti spesso questo evento viene intercettato, in modo tale che prima di
convalidare i dati, questi vengono controllati in base alle regole che
scegli tu, se è tutto a posto i dati passano, altrimenti l'evento viene
consumato. Ovvio che dovrai ripristinare il vecchi valore, recuprandolo dal
model mediante getValueAt(int row, int column).
Spero di avrti levato qualche dubbio se ne hai altri, scrivimi direttamente.
dciv...@tiscalinet.it