KuroKami69 ha scritto:
Ma quindi, devo rimuovere elementi dalla lista anche, oltre che le righe, quando io decremento il numero di elementi da visualizzare giusto (mi sono appena svegliato quindi sto ancora mettendo in moto il cervello)
Se ho capito bene quello che vuoi fare tu non è togliere/rimuovere le automobili dalla tabella, quindi rimuovere gli elementi dalla lista non ha molto senso, perché se poi aumenti il numero di righe da visualizzare non verranno più mostrate, a meno che tu non ti memorizzi gli oggetti che togli per poi rimetterli in seguito, cosa abbastanza insensata.
Tu vuoi invece che il modello sottostante rimanga immutato, ma che siano filtrate in tempo reale le righe da mostrare all'utente.
Il problema è che il concetto di filtro per come è stato implementato in modo "standard", ovvero con l'uso di un RowFilter, non prevede di considerare l'indice della riga. Guarda questo esempio
qui (riporto solo il codice che ci riguarda):
RowFilter<Object, Object> filter = new RowFilter<Object, Object>() {
public boolean include(Entry entry) {
Integer population = (Integer) entry.getValue(1);
return population.intValue() > 3;
}
};
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
sorter.setRowFilter(filter);
table.setRowSorter(sorter);
Quell'Entry sarebbe fondamentalmente un oggetto che contiene i dati visualizzati nella riga, campo per campo, come vedi nell'esempio si prende l'indice 1, che nella colonna corrisponde al valore dell'item, che se minore o uguale di 3 causerà il fatto che la riga venga nascosta, ma non cancellata dalla tabella.
RowFilter fornisce poi più metodi statici, tra cui il più utile è forse regexFilter (String regex, int... indices), che crea un filtro predefinito che filtra le righe in base al testo (usando un espressione regolare) contenuto nelle celle. Ma ancora una volta questo non ti aiuta a nascondere le righe con un "indice" superiore al numero di righe da mostrare.
Una soluzione (bruttina) con il RowFilter sarebbe di aggiungere alla tabella una colonna (che verrà poi nascosta dal TableColumnModel) che abbia un indice progressivo che serve solo come "id" della riga, quindi verrà introdotto nell'Entry passata al RowFiter (non ti occupi tu di richiamare il metodo o costruire l'Entry, è automatico) e potrai usarlo per dire: "se l'indice della riga è maggiore di n include ritorna false".
Ma questo andrebbe un po' a rompere il TableModel customizzato che stai utilizzando, dovresti aggiungere una colonna, cambiare il getValueAt (), e dovresti "sperare" che questa colonna sia nascosta da un'altra parte, perché non è il AutomobileTableModel che può decidere quali colonne vengono mostrate e quali no.
Se usi un tuo modello personalizzato puoi mantenere uno stato (con delle variabili) che memorizzi:
- Quante righe vuoi mostrare
- Quali tipi di veicoli vuoi visualizzare
Poi puoi costruire dei metodi per il tuo modello, es. setLimiteRighe (int row), setMostraAutomobili (boolean value), setMostraMoto (boolean value) etc., che vadano a modificare questi valori.
Poi però tutto il resto deve essere coerente con questa struttura! Come avevamo detto in precedenza, JTable non è un componente "facile" da utilizzare, e filtrare/ordinare le righe è una delle parti più difficili (almeno a mio parere) se non utilizzi i metodi già implementati.