2011-11-17 28 views

Respuesta

29

se puede establecer si es isEditable para TableColumn o TableColumn and TableCell demasiado

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

incorrecto - a) no hay ningún método es editable en cualquier lugar b) TableColumn no tiene ninguna noción de editabilidad en absoluto c) TableCell no existe. Correcto sería _isCellEditable_ ya sea en la implementación de TableModel o en JTable - -1 para sloppiness – kleopatra

17

Sustituir el table model

isCellEditable(int rowIndex, int columnIndex) toma dos argumentos, simplemente devolver cierto para la columna que desea?

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

Es 'columnIndex == 0' no' rowIndex == 0' –

+0

Ah, por supuesto, tonto error. Fijo. – EricR

5

JXTable/TableColumnExt del proyecto SwingX tienen API para configurar la capacidad de edición por tabla y por columnas

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

Tenga en cuenta que sólo es posible reducir la capacidad de edición en comparación al devuelto por el modelo. isCellEditable. Es decir, puede hacer que una celda editable sea de solo lectura, pero no al revés

-1

Leyendo la observación de Kleopatra (su 2da vez sugirió echar un vistazo a javax.swing.JXTable, y ahora lo siento, no tenía una mira la primera vez :)) Te sugiero que sigas el enlace

Busqué una respuesta, y combiné varias respuestas a mi propia solución: (sin embargo, no es seguro para todas las soluciones, pero es comprensible e impulsado rápidamente, aunque recomiendo mirar el enlace de arriba)

Puede mantenerlo más flexible para establecer qué columna es editable o no más adelante, lo usé para ejemplo:

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; 
      } 
    }); 

Y utilizado esta función para establecer editable o no:

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: por supuesto que tiene que definir columnsEditable y JTable tabla global en esta clase:

private JTable table; 
private ArrayList<Integer> columnsEditable; 

Nota 2 : de manera predeterminada, todas las columnas no son editables, pero ese es mi comportamiento deseado. Si desea otro elemento, puede agregar todas las columnas a columnas Editable o cambiar el comportamiento por completo (haga que las columnas ArrayListNonEditable en lugar). Con respecto a la observación de Kleopatra: es mejor no usar esta última sugerencia (pero depende del modelo de tabla utilizado y de lo que haces en el resto de tu programa).

+0

no es una solución segura: la vista _debe respetar la configuración del modelo, por lo que todo lo que implemente en el nivel de vista solo puede limitar la editabilidad del modelo, nunca lo amplíe.Entonces, en algún lugar de su código, primero debe consultar el modelo, y solo si eso es cierto, mantener o cambiar esa decisión – kleopatra

+0

Ok, gracias por esa retroalimentación, pero eso se puede implementar fácilmente, creo. Es más, quería más flexibilidad que la codificación de la columna que es editable. Pero es bueno pensarlo, cambiar las colmillas cambiará esto, sin embargo, normalmente configuro: table.getTableHeader(). SetReorderingAllowed (false) (por ejemplo) –

+0

@kleopatra: reflexionando sobre ello, tu comentario también depende de lo que hagas. usar como un modelo de tabla. El modelo de tabla predeterminado siempre es editable, por lo que establecer la editabilidad solo lo reducirá, nunca lo ampliará. Además mi solución solo gasta las posibilidades de las otras soluciones dadas. –

10

esto establecería el valor editable verdadero para la columna 3 y 8 y falso para otros.

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, buen pedazo de código. He modificado ligeramente para desactivar la célula particular, utilizando el siguiente código ... ** '@ Override \t \t \t pública booleano isCellEditable (int rowIndex, int columnIndex) { \t \t \t \t si (rowIndex == 0 && columnIndex == 1) { \t \t \t return false;} \t \t \t \t retorno canEdit [columnIndex]; } '... ... puede ser útil para desactivar una celda en particular. –

Cuestiones relacionadas