KuroKami69 ha scritto:
Per fare questo io ho bisogno di far arrivare i valori presi dai listener alla table model giusto? Quindi io quando associo il listener dello spinner, dentro farò una chiamata al metodo getrow() di tablemodel giusto? E via dicendo
Spero di essermi spiegato bene
Sì, direi, è chiaro cosa vuoi ottenere. E le domande che poni non sono di per sé completamente sbagliate. Nel senso che l'obiettivo è effettivamente quello di andare a controllare e gestire il table model (indipendentemente dal fatto che sia DefaultTableModel o uno personalizzato). Chiaramente con un table model personalizzato hai più flessibilità e puoi ragionare anche in maniera più object-oriented (rispetto a DefaultTableModel).
Ma dovresti cercare di affrontare meglio l'argomento dei table model insieme anche a qualche aspetto più di "design" delle classi. Capisco che il tuo approccio è molto "empirico" e più sul pratico ma serve (purtroppo) capire anche bene certi concetti.
Innanzitutto ti è chiaro ora il mio
AutomobileTableModel di esempio? C'è ancora qualcosa che non riesci a comprendere?
Il table model che ho scritto è molto stringato e permette molto poco. La lista di oggetti viene passata
solo al costruttore dopodiché nel table model non c'è altro che permetta di alterare questa lista. Insomma è proprio solo di presentazione di una lista e basta.
Immagina che si voglia aggiungere una riga di una nuova Automobile al fondo. Basta mettere nel table model un nuovo metodo del tipo:
public void aggiungiAutomobile(Automobile automobile) {
int newRow = automobili.size();
automobili.add(automobile);
fireTableRowsInserted(newRow, newRow);
}
Questo metodo è per te, che vuoi manipolare comodamente il table model. NON è per JTable (che non "sa" nulla di questo perché usa solo i metodi della interfaccia TableModel).
Sì, è tutto qua. La struttura dati interna (quel
private List<Automobile> automobili) va ovviamente aggiornata facendo il add del nuovo elemento.
Questa però è solo una struttura dati in memoria. Nessun'altro ne "sa" nulla della modifica (meno che mai il JTable). Ecco perché serve il fireTableRowsInserted che è offerto "a gratis" da AbstractTableModel.
Il fireTableRowsInserted serve per notificare tutti i listener registrati (e in primis JTable) che c'è una nuova riga inserita. A quel punto JTable scatenerà altre richieste verso il table model per scoprire esattamente COSA è stato aggiunto e visualizzarlo.
Nota che prima prendo il size. Se prima c'erano 10 righe (indici validi 0 ... 9), la nuova riga è proprio all'indice 10. E quindi dico che ci sono nuove righe da 10 a 10 inclusi, in pratica una singola riga.
Altrove, ad esempio nella classe del frame, avevo messo la variabile di istanza
private AutomobileTableModel tableModel. Quindi se lì nella classe del frame gestisci un listener, sarebbe perfettamente possibile fare:
tableModel.aggiungiAutomobile( .... una nuova automobile ... );
Tutto qui, è questo il modo in cui si dovrebbe ragionare.