KuroKami69 ha scritto:
Non ho detto errori, ho detto eccezioni, perché, quando avvio il programma, essendo la tabella vuota, il setAutoCreateRowSorter () mi rimanda l'eccezione che non ha elementi della tabella su cui lavorare.
Ho risolto questa cosa chiamando il metodo quando premo il bottone "visualizza", e funziona una meraviglia.
Intendevo dire eccezioni, sono stato impreciso nel termine, comunque era per dire errori in esecuzione.
E ripeto, non direi che il
setAutoCreateRowSorter () debba lanciare per forza un eccezione se la tabella è vuota, a me non succede quindi penso che ci sia "dell'altro".
Cosa vuol dire che chiami il metodo quando premi il bottone visualizza? Intendi dire il
setAutoCreateRowSorter ()? Se sì non ha molto senso, quello va impostato in fase di creazione della tabella, o al massimo una volta se cambi il RowSorter.
Così tu richiameresti il metodo ad ogni pressione del bottone visualizza, quindi non hai il controllo di quando/quante volte verrà chiamato, il che è inutile se non dannoso.
KuroKami69 ha scritto:
L'altra cosa che non riesco a fare, è sempre quella di avere un cambio dinamico di header name per la colonna "Cavalli" (che dovrebbe diventare KW quando spunto il checkbox). Ma quasi quasi provo a sparare anche questo cambio nel codice del checkbox e vediamo se funziona.
Come mi hai fatto vedere te ansharja, me lo cambia solo una volta e basta e a me non va bene
No, nel codice del listener sul checkbox no. O almeno, dipende da come vuoi farlo. Se intendi accedere direttamente al tableheader, per cambiare il valore mostrato, evita assolutamente. Lì nel listener tu devi solo dire al modello "ora il checkbox è selezionato/deselezionato, aggiornati di conseguenza", e lo fai ad esempio con:
tableModel.setShowKV (/* true o false in base allo stato nuovo del checkbox*/);
Il table model modifica la propria variabile
showKV, che userà nel
getColumnName () per ritornare "Cavalli" o "KV" a seconda del valore di
showKV (ovviamente solo per il columnIndex corrispondente a quella colonna).
Fare in questo modo ti permette anche di gestire in modo buono la modifica dei valori della colonna, che gestirai nel
getValueAt (), chiedendo alla Automobile i cavalli o i KV in base sempre al valore della variabile.
Ti devi solo ricordare di richiamare entrambi i metodi
fire nel setShowKV (), perché in quel momento deve cambiare sia la visualizzazione dell'header (
fireTableStructureChanged ()) sia i dati che mostri nella colonna (
fireTableDataChanged ()).
L'ho provato e funziona correttamente.
KuroKami69 ha scritto:
Faccio un altro messaggio, perché a volte gli edit non vengono letti.
l'unico dubbio che mi rimane è se mettere o meno un fire method, e se si quale mmh perché l'header fa parte della tabella in maniera differente rispetto alla lista di automobili.
EDIT: ok funziona ahahahaha un semplice fireTableStructureChanged() dopo il cambiamento del nome header e apposto
Vedi sopra, non so dove/come hai fatto le cose, ma il modo migliore per farlo è appunto gestire il tutto in modo sicuro all'interno del table model.
KuroKami69 ha scritto:
Ora le uniche cose che mi restano da fare per finire il lavoro sono
1) colorare una riga si e una no, o eventualmente, nel caso di auto e moto, far apparire auto moto auto moto, e colorare le moto
penso si possa fare semplicemente facendo 2 add di fila alla lista anziché 1, ovviamente dopo che il listener dirà che è stata attivata tale funzione
2) mettere un bel campo di ricerca, perché fa bello e completo il programma
3) sistemare il layout, perché se lo apro a schermo intero mi mette la tabella nella seconda metà e il panel dei bottoni mi viene ingrandito e occupa la metà superiore della finestra, ma qua credo basti un qualche semplice set sul panel dei bottoni.
4) spezzare la mia classe automobili e mettere tutti i metodi di assegnazione su una classe componenti, da cui poi richiamerò i metodi sia da auto che da moto e a seconda del nome della classe che li chiama, cambierà anche il file di testo che andranno a leggere e le dimensioni degli array/matrici associati ovviamente
5) finire gli ultimi metodi che ho lasciato in sospeso, cilindri e cilindrata (mi mancano i range di valori approssimativamente reali)
6) fare i file di testo con i modelli, tipologie ecc per le moto
e il progetto si potrà dire concluso.
il prossimo che farò sarà qualcosa di nettamente più semplice (il gioco della tombola con tabellone e 5, massimo 7 schedine) in cui redigerò anche il chenlog (chanlog?). magari potrei anche pensare a un diagramma delle classi prima, tanto per far felici i prof, ma non son bravissimo sotto quell'aspetto
1) Il colore di background delle righe lo puoi cambiare facendo l'override di
getTableCellRendererComponent ().
Trovi vari esempi in rete, e hai la possibilità di cambiare tra le altre cose: allineamento, font e colore del testo, margini, bordo e sfondo della riga (e altro ancora) e tutto in base al fatto che la riga/colonna sia selezionata o meno, o in base al numero di riga/colonna, tutto quello che vuoi. Alternare i colori nelle righe è banale, colorare in un modo auto e nell'altro moto è banale, ordinare auto e moto nella lista per mostrarle alternate invece è molto più complesso, e andrebbe pensato bene (pensa se hai rimozioni/aggiunte quanto dovresti lavorare con gli add e i remove per "riallineare" il tutto, a questo punto sarebbe meglio semplicemente riordinare la lista, ma anche qui non è immediato, perché l'ordinamento "standard" è ottenuto con un semplice
Collections.sort () e l'implementazione dell'interfaccia
Comparable / uso di
Comparator, ma i confronti sono fatti a due a due tra gli oggetti in modo indipendente dal resto degli elementi).
2) Bella cosa sì, ma più avanzata di quello che stai facendo adesso. O ti usi i filtri di cui avevo parlato in precedenza (riguarda il tutorial sulle tabelle e dovresti trovare esempi in cui il testo viene filtrato), o devi implementarlo tu nel table model, cosa non impossibile comunque (secondo me ad esempio è più facile questo rispetto ad alternare moto e auto nella lista).
3) Per usare bene i layout occorre un po' di tempo, la tabella sicuramente non è facile da gestire, se vuoi farla dimensionata in base al contenuto, sistemare i pannelli nella posizione corretta è più facile.
4) Onestamente non mi è chiaro quello che vuoi fare. Se intendi solo che crei la lista di auto e moto all'esterno, da file di testo, è perfettamente sensato. Il resto è un po' confuso, soprattutto quando dici "a seconda del nome della classe che li chiama".
5) - 6) Ok.
Ma una volta che avrai i file di testo con i dati, vuoi continuare con questa roba di creare una tabella vuota e aggiungere/togliere righe così per sport? Non sarebbe meglio avere un insieme di dati già pronto, che leggi da file, e mostrare come risultato finale una bella tabella già pronta con tutti i dati e la possibilità di filtrare i dati, limitare il numero delle righe, cambiare la visualizzazione di cavalli/KV e tutto il resto ?