2008-09-17 8 views
11

Ci sono dei buoni libri o un sito web che vanno oltre la creazione di un JTable? Voglio rendere una colonna modificabile. Mi piacerebbe inserire un componente ereditato JCheckBox (che abbiamo creato qui) in una delle colonne della tabella invece di fare in modo che la tabella inserisca JCheckBox in base al fatto che è un campo modificabile boolean.Tutorial modificabile per JTable

Ho il libro JFC Swing Tutorial Second Edition ma vorrei solo sapere se ci sono altri esempi che potrei guardare e imparare come gestire meglio i tavoli. Il libro sembra semplicemente prendere la "traccia" java online e inserirla nel libro.

Sto rileggendo la roba però, solo curioso se qualcuno ha trovato qualcosa che potrebbe aiutare di più.

+0

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. "). –

risposta

31

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.

+0

wow molte informazioni Grazie –

+0

Un paio di anni in ritardo, ma ottima risposta Grazie! – imiric

1

La classe che si desidera estendere per creare il proprio comportamento è DefaultTableModel. Ciò ti consentirà di definire il tuo comportamento. Un tutorial decente può essere trovato on sun's site.

+0

sì, questo è il percorso che sto attualmente guardando :) Abbiamo esteso AbstractTableModel qui prima e so che devo scavalcare getColumnClass e isCellEditable e tutto questo, sto solo avendo problemi a cogliere affrontando tutto questo su celle modificabili :( –

1

Questo tutorial dello java lobby è facile da seguire. Lo Swing trail for JTable online di riferimento indica che è stato aggiornato. Hai esaminato l'intera faccenda per una possibile migliore informazione (non è sempre più nuova)?

0

Alcune classi utili sono:

Package javax.swing.table:

TableModel - Interfaccia per un tablemodel AbstractTableModel - Classe di Nizza da estendere per creare il proprio tavolo con strutture di dati personalizzati DefaultTableModel - modello della tabella di default che può trattare con arrays[] e

Per disabilitare la modifica su qualsiasi cella è necessario ignorare lo isCellEditable(int row, int col) me thod

1

Se si sta tentando di utilizzare un semplice JTable con una colonna modificabile e si conosce la posizione della colonna, è possibile utilizzare sempre il modello di tabella predefinito e sovraccaricare la chiamata isCellEditable.

qualcosa di simile:

myTable.setModel(new DefaultTableModel(){ 
@Override 
public boolean isCellEditable(int row, int column) { 
    if (column == x) { 
     return true; 
    } else 
     return false; 
} 
}); 

E per la casella di controllo creare una classe renderer

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer 
0

nella tabella del modello, si dovrebbe ignorare e funzioni "isCellEditable" "setValueAt", come qui di seguito .
La colonna 4 è la colonna per le celle modificabili.
Quindi quando si fa doppio clic sulla cella e si digita qualcosa, viene chiamato
setValueAt() e si salva il valore sul DO di tableModel, campo col4.

public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table 

@Override 
public boolean isCellEditable(int row, int col) { 
    if (col == 4) { 
     return true; 
    } else { 
     return false; 
    } 
} 

@Override 
public void setValueAt(Object value, int row, int col) { 
    if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) { 
     if (col == 4) { 
      tbmData.get(row).col4= (String) value; 
     } 
     fireTableCellUpdated(row, col); 
    } else { 
    } 
}