Come rendere non modificabile un JTable


Risposte:


22

Puoi usare un file TableModel.

Definisci una classe come questa:

public class MyModel extends AbstractTableModel{
    //not necessary
}

in realtà isCellEditable()è falsedi default, quindi puoi ometterlo. (vedi: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )

Quindi usa il setModel()metodo del tuo JTable.

JTable myTable = new JTable();
myTable.setModel(new MyModel());

1
Non puoi fare in modo che un public voidmetodo restituisca un valore booleano.
Geo

1
Anche il metodo èisCellEditable
Matt

Sebbene l'approccio specificato funzioni, non esiste un metodo come isEditable in AbstractTableModel. Quello che esiste è il metodo isCellEditable (int, int) che accetta rowIndex e coulmnIndex come parametri. L'utente può abilitare / disabilitare selettivamente la modifica per una particolare riga / colonna sovrascrivendo il metodo "isCellEditable" oppure può utilizzare l'implementazione predefinita per disabilitare la modifica per tutte le celle.
sateesh

150

Puoi sovrascrivere il metodo isCellEditable e implementarlo come desideri, ad esempio:

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

o

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       //Only the third column
       return column == 3;
   }
};

table.setModel(tableModel);

Nota per se il tuo JTable scompare

Se JTablestai scomparendo quando lo usi, è molto probabile perché devi usare DefaultTableModel(Object[][] data, Object[] columnNames)invece il costruttore.

//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

3
Questa è anche la soluzione per far funzionare correttamente gli eventi di doppio clic con JTable. Un doppio clic viene normalmente consumato da una cella quando entra in modalità di modifica, e questo impedirà a una cella di farlo e invierà invece il doppio clic alla JTable stessa. Grazie per la soluzione, Nelson!
anacoreta

2
@Jop allora qualcosa non va altrove nel tuo codice - una tabella non scompare mai solo perché il modello della tabella non è modificabile ...
kleopatra

1
@DougHauf sembra che tu non conosca Java, o in realtà qualsiasi linguaggio così bene poiché la maggior parte dei linguaggi usa la stessa sintassi per le operazioni booleane ... che restituisce un booleano ... ti consiglio di cercare un Java molto semplice tutorial e iniziare dall'inizio. Provare a lanciarti nello swing in questo modo finirà per farti imparare tutto male.
searchengine27

1
@DougHauf, == è un alias per la funzione Equals che confronta gli oggetti (a sinistra ea destra) e restituisce un valore booleano. Suppongo che tu abbia usato l'istruzione if che valuta valori booleani e di solito è usata con questo tipo di espressioni, ad esempio if (a == b) fa qualcosa. Prova a stampare un == b o semplicemente assegnalo a una variabile e comprendi il risultato.
nelson eldoro

1
La correzione di cui sopra non funziona neanche per me. Fa scomparire la colonna e gli elementi dati della tabella. La mia tabella viene creata con table = new JTable (tempTable, columnNames) ;, dove tempTable è una String [] [] e Column Names è una String []. Credo che il problema sia causato dal nuovo DefaultTableModel () che non specifica i dati e i nomi delle colonne per il modello di tabella. Come si specificano quelli nel modello dati. Ho provato table.setModel (tableModel (tempTable, columnNames)); ma questo causa un errore "impossibile trovare il simbolo".
user1164199

49
table.setDefaultEditor(Object.class, null);

2
Questa è la risposta migliore e più semplice. Ovviamente, devi impostare l'editor su null in modo da non essere in grado di modificarlo.
LEMUEL ADANE

Funziona alla grande con la selezione singola. Quale era il mio requisito.
Wesos de Queso

Questa dovrebbe essere la RISPOSTA!
KrishPrabakar

36

basta aggiungere

table.setEnabled(false);

per me funziona bene.


1
Questo è fantastico se non stai usando un modello di tavolo personalizzato!
Kingsolmn

26
Ma non sarai in grado di selezionare una cella o una riga.
tianz

3
Questo apparirà "in grigio" in alcuni L&F.
Stommestack

2
Che funzioni. Grazie. Tuttavia, mi piacerebbe ancora sapere perché il metodo del modello di dati di Nelson fa sì che la colonna della tabella e gli elementi di dati scompaiano.
user1164199

1
Funziona bene per me!
Colby Cox

10

Se stai creando il TableModel automaticamente da un insieme di valori (con "new JTable (Vector, Vector)"), forse è più facile rimuovere gli editor dalle colonne:

JTable table = new JTable(my_rows, my_header);

for (int c = 0; c < table.getColumnCount(); c++)
{
    Class<?> col_class = table.getColumnClass(c);
    table.setDefaultEditor(col_class, null);        // remove editor
}

Senza editor, i dati non saranno modificabili.


4
-1 l'hacking casuale in luoghi inappropriati non è mai un'opzione
kleopatra

Per favore, puoi spiegare perché si tratta di un "hacking casuale in luoghi inappropriati"? Secondo il documento setDefaultEditor () : "Se l'editor è nullo, rimuove l'editor predefinito per questa classe di colonna."
freesoft

sì, e torna al valore predefinito per Object ;-) Quindi non disabiliti davvero la modifica (solo accidentalmente se una delle colonne è di tipo Object), inoltre ti mancano tutte le colonne che potrebbero avere un editor personalizzato. V'è api pensato per essere implementato per la modificabilità delle cellule di controllo, e questo è il modello del. Tutto il resto è hacking e come tale inappropriato.
kleopatra

Capisco il tuo punto. Ma quello che ho capito dall'API è che, se creo una tabella in modo veloce (con "new JTable (Vector, Vector)"), la tabella avrà gli editor predefiniti per tutte le sue colonne. Quindi, se eseguo "table.setDefaultEditor (column, null)", rimuoverò l'editor predefinito dalla colonna, quindi la colonna non avrà alcun editor e la colonna non sarà modificabile. Sarà?
freesoft

Avevo creato il tavolo in quel modo new JTable(Vector, Vector)e ho lavorato per me. Non ho bisogno di un editor in nessuna cella, quindi hai il mio voto.
Dani Sancas

3

L'ho usato e ha funzionato: è molto semplice e funziona bene.

JTable myTable = new JTable();
myTable.setEnabled(false);

2
La selezione non sarà possibile.
h3xStream

Soluzione semplice e piacevole
Nuwan Harshakumara Piyarathna

La domanda riguarda modificabile non abilitato. L'abilitazione non risolve lo scopo
shaILU

2

creare una nuova classe DefaultCellEditor:

public static class Editor_name extends DefaultCellEditor {
  public Editor_name(JCheckBox checkBox) {
   super(checkBox);
  }
  @Override
  public boolean isCellEditable(EventObject anEvent) {
    return false;
  }
}

e usa setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.