Bene finalmente stasera mi son rimesso sul codice, ho dato una riletta al tuo per vedere le parti essenziali richieste per questa classe ed effettivamente, quello che ad un primo momento non ho notato ora mi porta qualche domanda
public Class<?> getColumnClass(int columnIndex) {
return tipiColonne[columnIndex]; // espone il tipo alla tal colonna
}
anzitutto, perché quel <?>?
poi
private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
anche qua, le chiavi static non le ho ancora fatte, anche se ho una vaga idea di cosa fanno, ma di nuovo, perché <?>? e perché hai scritto String.class?
EDIT: onestamente ora che sto provando a buttare giù del codice mio, non riesco a immaginare completamente il funzionamento della tua classe tablemodel
andando con ordine
private static final String[] nomiColonne = { "Marca", "Modello", "Anno" };
private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
qua crei 2 array, il primo sicuro, il secondo forse crei un array di classi? probabilmente si
EDIT: daje non son capace di fare una cosa unica. qua tu sostanzialmente rendi l'intera colonna, o più propriamente l'header della colonna, e di conseguenza la colonna stessa, una classe a cui poi bindi il metodo relativo. quindi se ad esempio io ho 10 auto, questa mi chiama 10 volte il metodo get.modello per esempio?
private List<Automobile> automobili;
qua crei una lista di oggetti automobile e a questa lista dai il nome automobili
public AutomobileTableModel(List<Automobile> automobili) {
this.automobili = automobili;
}
vabbeh questo è il costruttore, a cui dici "hey, questa lista ha i valori della lista che ti passo" (in teoria, poi forse ho frainteso)
@Override
public String getColumnName(int columnIndex) {
return nomiColonne[columnIndex]; // espone il nome alla tal colonna
}
qua, non son sicuro, anzi non l'ho capita. non ne capisco l'utilizzo. riceve una variabile di tipo int, da non ho capito dove e la usa per dire "sei sulla colonna n". credo
@Override
public Class<?> getColumnClass(int columnIndex) {
return tipiColonne[columnIndex]; // espone il tipo alla tal colonna
}
qua, se non ho frainteso, hai reso le colonne della tabella delle classi, ma non capisco cosa fa, dove va a lavorare questo metodo ne da dove riceve l'input
@Override
public int getRowCount() {
return automobili.size(); // espone il numero di righe (È il numero di elementi nella lista)
}
questo è abbastanza banale, ritorna la grandezza della lista di automobili e quindi quante righe dovrà avere la mia tabella. io questo metodo per usarlo con i listener, lo richiamerò nel metodo del listener quando lo associo al bottone che mi lavora con lo spinner giusto?
@Override
public int getColumnCount() {
return nomiColonne.length; // espone il numero di colonne (È il numero di nomi)
}
mentre questo invece ritorna il numero di colonne che compongono la tabella
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Automobile automobile = automobili.get(rowIndex);
switch (columnIndex) {
case 0: return automobile.getMarca();
case 1: return automobile.getModello();
case 2: return automobile.getAnno();
default: return null; // non dovrebbe succedere
}
questo è quello che mi lascia più perplesso. prende in ingresso il return degli ultimi 2 metodi che hai scritto, e che di conseguenza ho copiato qua giusto?
poi crei un oggetto automobile usando il costruttore presente nella lista automobili. ma quel rowindex devo ancora capire da dove lo tiri fuori
poi sostanzialmente usi uno switch e dici "se columnindex vale 0 mi ritorni il metodo get marca e via dicendo" se non ha valori mi ritorni null.
ok ma allora. non ho capito il funzionamento globale. non capisco dove poi i vari metodi vengono usati e la cosa mi manda nel pallone più totale. più provo a capire e meno capisco e più mi irrito
EDIT: ragionandoci un attimo su, questi metodi vengono chiamati continuamente da JTable per aggiornare la tabella o mi sbaglio? quindi la loro chiamata starà in quello che sarà il file java di JTable giusto?
EDIT: di nuovo si.
giocandola molto a fumetto succede più o meno questo
il mio frame con la tabella è in esecuzione.
la tabella ha un listener incorporato diciamo, che appena accade qualcosa di significativo dentro al frame, tipo la pressione di un bottone o anche la scelta di un radio, jtable va a chiamare nuovamente i metodi nel tablemodel per aggiornarsi. impostando opportunamente i listener, posso essere io a dire a jtable secondo quali eventi fare qualcosa