2012-03-29 12 views
23

Quando viene creato un componente JTable, la modifica della cella è abilitata per impostazione predefinita. Come posso impedire all'utente di modificare il contenuto di una tabella di J?Disabilita modifica utente in JTable

+2

Vedere [* Come usare le tabelle *] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html). – trashgod

risposta

33

Un JTable utilizza un oggetto AbstractTableModel. Questa è la cosa che passi al costruttore della JTable. È possibile scrivere il proprio AbstractTableModel come segue

public class MyTableModel extends AbstractTableModel { 

     public boolean isCellEditable(int row, int column){ 
      return false; 
     } 

} 

e poi inizializzare il JTable come

JTable myTable = new JTable(new MyTableModel()); 
+0

Stavo provando questo codice per evitare che l'utente potesse modificare il contenuto di una cella, che sta funzionando. Tuttavia, evita anche che l'applicazione cambi il contenuto della cella, c'è qualche soluzione alternativa per quel particolare scenario? – clement

+3

Apparentemente, passare semplicemente un booleano non era abbastanza di classe per i progettisti ... – pauluss86

39

è possibile creare una JTable seguente codice utilizzando:

JTable jTable = new JTable() { 
     private static final long serialVersionUID = 1L; 

     public boolean isCellEditable(int row, int column) {     
       return false;    
     }; 
    }; 

Fondamentalmente quello che stiamo facendo qui è prevalente isCellEditable e ritornando sempre falsa da esso. Ciò renderà una JTabel non modificabile.

+0

Se questo è tutto ciò che fai, non vedo un problema con l'utilizzo di una classe anonima. – Chase

+3

questa dovrebbe essere la risposta migliore. Non trovo nulla di sbagliato nell'usare la classe anon qui. L'utente più potrebbe utilizzare 'TableModel' diverso in un'altra posizione. Upvote! – instinct

+2

+1 @instict perché questo non influenza il modello di tabella questa è una risposta molto migliore a mio parere. Inoltre domanda: è veramente necessario il serialVersionUID? – Paul

4

Ciao Sto lavorando molto su Java in modo da sto andando vi do la mia strada: Ci sono due possibilità il primo sotto netbeans. Vai a personalizzare il codice e renderlo in questo modo:

JTArticleJPAddArrticle = new javax.swing.JTable(); 

JTArticleJPAddArrticle.setBackground(new java.awt.Color(204, 204, 255)); 

JTArticleJPAddArrticle.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] { 

}, 
new String [] { 
    "Reference","Libellé","Marque","Prix d'achat","Prix de vente","Quantité","Total","Etat" 
} 
){ 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return false; 
} 
}); 



jScrollPane8.setViewportView(JTArticleJPAddArrticle); 

Il mio altro modo è quello di farlo è quello di fare un esempio di modello di tabella. Questo è il secondo modo:

model=new DefaultTableModel(head, 0){ 

    @Override 
    public boolean isCellEditable(int i, int i1) { 
     return false; //To change body of generated methods, choose Tools | Templates. 
    } 

    }; 
jtable.setmodel(model); 

Godere questo sta funzionando bene per me. Tutto quello che voglio fare è aiutare voi ragazzi perché sono stato aiutato molto prima.

+0

Questi sono entrambi allo stesso modo.Il secondo snippet di codice contiene solo un codice meno pertinente, che lo rende migliore come risposta. –

+0

@MicahStairs nel processo di esecuzione il primo è migliore perché la classe verrà compilata facilmente rispetto alla seconda è un override che richiederà un po 'più di tempo, ma da una vista di progettazione per lo sviluppatore il secondo è un codice facilmente gestibile; –

10
myTable.setDefaultEditor(Object.class, null); 
+2

Forse potresti spiegare questo lavoro e enumerare gli svantaggi? Sembra che la semantica sia diversa dalle risposte precedenti - vale a dire. stai impostando un editor nullo. Forse questo è più lento perché affermare se la tabella è modificabile richiede o seguire un percorso di codice più lungo? –

+1

Questa è la risposta semplice che stavo cercando. Potrebbe non essere la migliore prestazione saggia, ma la sua semplicità è valsa la pena. – Cristian

2

Vi siete provato semplicemente:

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

Chi JComponent.setEnabled(boolean) esso Sayes:

Imposta o meno di questa componente è abilitato. Un componente abilitato può rispondere all'input dell'utente, mentre un componente non abilitato non può rispondere all'input dell'utente. Alcuni componenti possono alterare la loro rappresentazione visiva quando sono disabilitati al fine di fornire un feedback all'utente che non possono prendere input.

Quando si tratta di JTable, non sembra fornire alcun riscontro visivo. Con il vantaggio di poter ancora fare clic sulle intestazioni delle colonne. E nella mia implementazione l'applicazione potrebbe ancora cambiare il contenuto delle celle.

+0

Oops. Ho appena visto che l'utente Siddhu è arrivato con la stessa soluzione qui: http://stackoverflow.com/questions/1990817/how-to-make-a-table-non-editable?noredirect=1&lq=1. non so se dovrei rimuoverlo qui o lasciarlo, dal momento che non so quale domanda potrebbe essere cancellata come duplicato. Siamo spiacenti, un noob qui: o – brat

+0

Problema con questo è che l'utente non può vedere se qualsiasi riga o cella è selezionata anche dopo aver cliccato. ho trovato che usare 'setDefaultEditor()' per essere migliore di questo in quanto fornisce un riscontro visivo quando l'utente seleziona una riga o una cella. – anotherGatsby

0
 tm = new javax.swing.table.DefaultTableModel() 
       { 
         public Class<?> getColumnClass(int column) 
         { 
         switch(column) 
         { 
         case 0: 
          return String.class; 
         case 1: 
          return String.class; 
         case 2: 
          return String.class; 
         case 3: 
          return String.class; 
         case 4: 
          return String.class; 
         case 5: 
           return String.class; 
          case 6: 
           return String.class; 
          case 7: 
           return String.class; 
          case 8: 
           return String.class; 
          case 9: 
            return String.class; 
           case 10: 
            return String.class; 
           case 11: 
            return Boolean.class; 

          default: 
          return String.class; 
         } 
         } 

         @Override 
         public boolean isCellEditable(int row, int column) { 
         /* Set the 11th column as editable and rest non- 
           editable */ 
          if(column==11){ 
           return true; 
          }else{ 
//all other columns to false 
         return false; 
          } 
         } 
        }; 
    table = new javax.swing.JTable(tm); 
+0

Si prega di [modificare] (https://stackoverflow.com/posts/49110309/edit) la tua risposta per spiegare perché questo pezzo di codice risponde alla domanda. –