Domanda

Esistono buoni libri o siti Web che vanno oltre la creazione di un file JTable?Voglio rendere modificabile una colonna.Vorrei effettivamente mettere un ereditato JCheckBox componente (che abbiamo creato qui) in una delle colonne della tabella invece di inserire semplicemente la tabella JCheckBox in base al fatto che è modificabile boolean campo.

io ho il Tutorial JFC Swing seconda edizione libro ma vorrei solo sapere se ci sono altri esempi a cui potrei guardare e imparare a gestire meglio le tabelle.Il libro sembra semplicemente prendere il "percorso" di Java online e inserirlo nel libro.

Sto rileggendo il materiale però, sono solo curioso di sapere se qualcuno ha trovato qualcosa che potrebbe aiutarmi di più.

È stato utile?

Soluzione

Per rendere modificabile una colonna è necessario sovrascrivere il file isCellEditable metodo nel TableModel.Creare un TableModel è abbastanza facile se erediti AbstractTableModel e lo consiglierei a tutti tranne che ai più semplici JTableS.

Tuttavia, adattando il TableModel è solo una parte di ciò che devi fare.Per ottenere effettivamente un componente personalizzato nel file 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.

Editori

Se hai già un componente personalizzato, puoi farlo facilmente utilizzando la delega:Crea una nuova classe implementando TableCellEditor, e restituire a nuovo istanza del componente in getCellEditorComponent metodo.I parametri di questo metodo includono il valore corrente nonché 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 conferma una modifica al contenuto della cella (dove è possibile convalidare l'input dell'utente e regolare il modello) o annulla una modifica.Assicurati di chiamare il stopEditing() metodo sul tuo editor se interrompi la modifica a livello di codice, altrimenti il ​​componente editor rimarrà sullo schermo: una volta mi ci sono volute circa 2 ore per eseguire il debug.

Si noti che all'interno di a JTable editori e soltanto gli editori ricevono eventi!La visualizzazione di un pulsante può essere eseguita utilizzando un renderer.Ma per ottenere un pulsante funzionante, è necessario implementare un editor con il file corretto EventListeners registrato.La registrazione di un ascoltatore su un renderer non fa nulla.

Renderer

L'implementazione di un renderer non è strettamente necessaria per ciò che descrivi nella tua domanda, ma in genere finisci comunque per farlo, anche se solo per modifiche minori.I renderer, a differenza degli editor, sono critici in termini di velocità. IL getTableCellRendererComponent di un renderer viene chiamato una volta per ogni cella della 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 regolare il componente (ad es.utilizzando setText(...) O setFont(...) se è un TextComponent) nel renderer, dovresti non istanziarne uno nuovo: è un modo semplice per paralizzare le prestazioni.

Avvertenze

Tieni presente che affinché i renderer e gli editor funzionino, devi specificare il file JTable quando utilizzare un determinato renderer/editor.Ci sono fondamentalmente due modi per farlo.È possibile impostare il renderer/editor di cella predefinito per un certo tipo utilizzando i rispettivi JTable metodi.Perché funzioni in questo modo, il tuo TableModel deve restituire esattamente questo tipo nel file getColumnClass(...) metodo!Il modello di tabella predefinito lo farà non fallo per te, ritorna sempre Object.class.Sono sicuro che questo abbia sconcertato molte persone.

L'altro modo per impostare l'editor/renderer è impostarlo esplicitamente sulla colonna stessa, ovvero ottenere il file TableColumn tramite il getTableColumn(...) metodo del 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 della classe String che vengono visualizzate in modi completamente diversi, magari una volta utilizzando a JLabel/DefaultRenderer e l'altro utilizzando a JButton per accedere a un editor più elaborato.

JTable con i suoi renderer ed editor personalizzati lo è estremamente versatile, ma c'è anche molto da accettare e ci sono molte cose da fare di sbagliato.Buona fortuna!

Come utilizzare le tabelle In Il tutorial sull'altalena è una lettura obbligatoria per chiunque personalizzi JTables.In particolare, leggere e rileggere Concetti:Editor e renderizzatori perché in genere ci vuole un po' di tempo prima che faccia "clic".Anche gli esempi su renderer ed editor personalizzati sono molto utili.

Altri suggerimenti

La classe che vuoi esaminare estendendo per creare il tuo comportamento è DefaultTableModel.Ciò ti consentirà di definire il tuo comportamento.È possibile trovare un tutorial decente sul sito del sole.

Questo tutorial da lobby di Java è facile da seguire.L'on-line Percorso altalena per JTable a cui fai riferimento indica che è stato aggiornato.Hai analizzato il tutto per possibili informazioni migliori (non è sempre meglio) informazioni?

Se stai cercando di utilizzare un semplice JTable con 1 colonna modificabile e conosci la posizione della colonna puoi sempre utilizzare il modello di tabella predefinito e sovraccaricare il file isCellEditable chiamata.

qualcosa come questo :

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 crea una classe renderer

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer

Alcune classi utili sono:

Package javax.swing.table :

TableModel - Interfaccia per a tablemodel AbstractTableModel - Bella classe da estendere per creare la tua tabella con strutture dati personalizzateDefaultTableModel - Modello di tabella predefinito che può gestire arrays[] E Vectors

Per disabilitare la modifica su qualsiasi cella è necessario sovrascrivere il file isCellEditable(int row, int col) metodo

nel modello della tabella, dovresti sovrascrivere le funzioni "isCellEditable" e "setValueAt", come di seguito.
La colonna 4 è la colonna per le celle modificabili.
Quindi, quando fai doppio clic sulla cella e digiti qualcosa,
setValueAt() verrà chiamato e salverà il valore nel DO, campo col4 del tableModel.

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 {
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top