Per rendere modificabile una colonna, è necessario sovrascrivere il metodo isCellEditable
nello TableModel
. Creare un TableModel
è abbastanza facile se si eredita il AbstractTableModel
e lo consiglierei per tutti tranne il più semplice JTable
s.
Tuttavia, l'adattamento dello TableModel
è solo una parte di ciò che è necessario fare. Per ottenere effettivamente un componente personalizzato nel JTable
, è necessario impostare un renderer di celle personalizzato. Per utilizzare un componente personalizzato interattivo, è necessario impostare un editor di celle personalizzato. In alcuni casi, è sufficiente utilizzare versioni leggermente modificate delle classi predefinite per questo.
editori
Se avete già ottenuto un componente personalizzato è presto fatto utilizzando la delega: Creare una nuova classe che implementa TableCellEditor
, e restituiscono un nuova istanza del componente nel metodo getCellEditorComponent
. I parametri di questo metodo includono il valore corrente e le coordinate della cella, un collegamento alla tabella e se la cella è selezionata o meno.
Il TableCellEditor
ha anche un metodo che viene chiamato quando l'utente esegue una modifica al contenuto della cella (in cui è possibile convalidare l'input dell'utente e regolare il modello) o annullare una modifica. Assicurati di chiamare il metodo stopEditing()
sull'editor se interrompi la modifica a livello di codice, altrimenti il componente dell'editor rimarrà sullo schermo: una volta mi ci sono voluti 2 ore per eseguire il debug.
Si noti che all'interno di un editor JTable
e solo gli editor ricevono eventi! La visualizzazione di un pulsante può essere eseguita utilizzando un renderer. Ma per ottenere un pulsante funzionante, è necessario implementare un editor con la corretta EventListeners
registrata. La registrazione di un listener su un renderer non fa nulla.
Renderers
L'implementazione di un renderer non è strettamente necessario per ciò che si descrive nella sua interrogazione, ma in genere si finisce per fare lo stesso, anche se solo per piccole modifiche. I renderer, a differenza degli editor, sono critici per la velocità. Il getTableCellRendererComponent
di un riproduttore viene chiamato una volta per ogni cella nella tabella! Il componente restituito da un renderer viene utilizzato solo per dipingere la cella, non per l'interazione e quindi può essere "riutilizzato" per la cella successiva. In altre parole, dovresti aggiustare il componente (ad esempio usando setText(...)
o setFont(...)
se è un TextComponent
) nel renderer, dovresti non istanziare uno nuovo - questo è un modo semplice per paralizzare le prestazioni.
Avvertenze
Si noti che per renderer e redattori di lavorare, è necessario dire al JTable
quando utilizzare una certa renderer/editore. Ci sono fondamentalmente due modi per farlo. È possibile impostare il rendering/editor di celle predefinito per un determinato tipo utilizzando i rispettivi metodi JTable
. Per questo modo, il tuo TableModel
deve restituire esattamente questo tipo nel metodo getColumnClass(...)
! Il modello di tabella predefinito sarà non fai questo per te, restituisce sempre Object.class
. Sono sicuro che uno ha smarrito molte persone.
L'altro modo per impostare l'editor/renderizzatore è impostandolo esplicitamente sulla colonna stessa, ovvero ottenendo lo TableColumn
tramite il metodo getTableColumn(...)
dello JTable
. Questo è molto più elaborato, tuttavia, è anche l'unico modo per avere due diversi renderer/editor per una singola classe. Per esempio. il tuo modello potrebbe avere due colonne di classe String che vengono renderizzate in modi completamente diversi, forse una volta utilizzando uno JLabel/DefaultRenderer
e l'altro utilizzando un JButton
per accedere a un editor più elaborato.
JTable
con i suoi renderer ed editor personalizzati è estremamente versatile, ma è anche molto da prendere e ci sono molte cose da fare male. In bocca al lupo!
How to Use Tables in The Swing Tutorial è una lettura obbligatoria per chiunque personalizzi JTables. In particolare, leggere e rileggere Concepts: Editors and Renderers perché in genere richiede un po 'di tempo per "fare clic". Anche gli esempi su renderer e editor personalizzati sono molto utili.
Si prega di riformulare la domanda, in modo che non suona fuori tema ("Domande che ci chiede di consigliare o trovare un libro, strumento, libreria software, tutorial o altra risorsa off-site sono off-topic per Stack Overflow in quanto tendono ad attirare risposte e spam contestati, descrivono invece il problema e ciò che è stato fatto finora per risolverlo. "). –