2011-11-17 18 views

risposta

29

è possibile impostare se è isEditable per TableColumn o TableColumn and TableCell troppo

@Override 
public boolean isCellEditable(int row, int col) { 
    switch (col) { 
     case 0: 
     case 1: 
      return true; 
     default: 
      return false; 
     } 
} 
+12

errato - a) non esiste alcun metodo è Editabile ovunque b) TableColumn non ha alcuna nozione di modificabilità per tutti c) TableCell non esiste. Corretto sarebbe _isCellEditable_ sull'implementazione TableModel o su JTable - -1 per la scarsità – kleopatra

17

Override l'table model

isCellEditable(int rowIndex, int columnIndex) accetta due argomenti, basta restituire true per la colonna che si desidera?

public boolean isCellEditable(int rowIndex, int columnIndex){ 
return columnIndex == 0; //Or whatever column index you want to be editable 
} 
+0

È 'columnIndex == 0' not' rowIndex == 0' –

+0

Ah, naturalmente, errore di battitura. Fisso. – EricR

5

JXTable/TableColumnExt del progetto SwingX hanno API per configurare la modificabilità per-tavolo e per-colonna

// make the table completely read-only 
xTable.setEditable(false); 
// make a column read-only 
xTable.getColumnExt(index).setEditable(false); 

Si noti che è possibile solo per restringere la modificabilità rispetto a quello restituito da modello. isCellEditable. Cioè puoi rendere una cella modificabile a sola lettura ma non viceversa

-1

Leggere l'osservazione di Kleopatra (la sua seconda volta ha suggerito di dare un'occhiata a javax.swing.JXTable, e ora mi dispiace non averlo guardate la prima volta :)) Vi suggerisco di seguire il link

Ho cercato un asnwer e ho combinato diverse risposte alla mia soluzione: (comunque, non sicuro per tutte le soluzioni, ma comprensibile e veloce, anche se io consiglio di guardare il link sopra)

Puoi tenerlo più flessibile per impostare quale colonna è modificabile o non più tardi, ho usato questo per exmaple:

columnsEditable=new ArrayList<Integer>(); 
    table=new JTable(new DefaultTableModel(){ 

      @Override 
      public boolean isCellEditable(int row, int col) { 
       if(columnsEditable.isEmpty()){ 
        return false; 
       } 
       if(columnsEditable.contains(new Integer(col))){ 
        return true; 
       } 
       return false; 
      } 
    }); 

E ho usato questa funzione per impostare modificabile o meno:

public void setColumnEditable(int columnIndex,boolean editable){ 
    if(editable){ 
     if(!columnsEditable.contains(new Integer(columnIndex))){ 
      columnsEditable.add(new Integer(columnIndex)); 
     } 
    }else{ 
     if(columnsEditable.contains(new Integer(columnIndex))){ 
      columnsEditable.remove(new Integer(columnIndex)); 
     } 
    } 
} 

Nota: naturalmente è necessario definire columnsEditable e JTable tabella globale in questa classe:

private JTable table; 
private ArrayList<Integer> columnsEditable; 

Nota 2 : per impostazione predefinita tutte le colonne non sono modificabili, ma questo è il mio comportamento desiderato. Se vuoi qualcosa di diverso, aggiungi tutte le colonne a columnsEditable o cambia il comportamento completamente (fai in modo che ArrayList non sia mai colonneNonEditable). Per quanto riguarda l'osservazione di Kleopatra: è meglio non usare questo ultimo suggerimento (ma dipende dal modello di tavolo usato e da ciò che si fa nel resto del programma).

+0

non è una soluzione sicura: la vista _must_ rispetta le impostazioni del modello, quindi qualunque cosa tu implementi a livello di vista può solo restringere l'editabilità del modello, non allargarlo mai.Quindi da qualche parte nel tuo codice devi prima interrogare il modello, e solo se questo restituisce true, tieni o cambia la decisione – kleopatra

+0

Ok, grazie per quel feedback, ma che può essere implementato facilmente, penso. È più che volevo più flessibilità di codificare la colonna che è modificabile. Ma è una buona cosa da pensare, cambiare i colori lo cambierà, ma normalmente lo imposto: table.getTableHeader(). SetReorderingAllowed (false) (ad esempio) –

+0

@kleopatra: riflettendo su di esso, il tuo commento dipende anche da ciò che usa come modello da tavolo. Il modello di tabella predefinito è sempre modificabile, quindi l'impostazione della modifica lo restringerà, non si allargherà mai. Inoltre la mia soluzione spende solo le possibilità delle altre soluzioni date. –

10

impostabile come true per le colonne 3 e 8 e false per gli altri.

DefaultTableModel model = new DefaultTableModel() { 

      boolean[] canEdit = new boolean[]{ 
        false, false, true, false, false,false,false, true 
      }; 

      public boolean isCellEditable(int rowIndex, int columnIndex) { 
       return canEdit[columnIndex]; 
      } 
}; 
+0

Thx @arash, bel pezzo di codice. Ho leggermente modificato per disabilitare la cella di particolare utilizzando il seguente codice ... ** '@ Override \t \t \t public boolean isCellEditable (int rowIndex, int columnIndex) { \t \t \t \t se (rowIndex == 0 && columnIndex == 1) { \t \t \t return false;} \t \t \t \t ritorno canEdit [columnIndex]; } '** ... può essere utile disabilitare una determinata cella. –

Problemi correlati