Cómo hacer que una JTable no sea editable


Respuestas:


22

Puede utilizar un TableModel.

Defina una clase como esta:

public class MyModel extends AbstractTableModel{
    //not necessary
}

en realidad isCellEditable()está falsepor defecto, por lo que puede omitirlo. (ver: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )

Entonces usa el setModel()método de tu JTable.

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

1
No puede hacer que un public voidmétodo devuelva un booleano.
Geo

1
También el método esisCellEditable
Matt

Si bien el enfoque que especifica funciona, no existe un método como isEditable en AbstractTableModel. Lo que existe es el método isCellEditable (int, int) que toma rowIndex y coulmnIndex como parámetros. El usuario puede habilitar / deshabilitar selectivamente la edición para una fila / columna en particular anulando el método "isCellEditable" o puede usar la implementación predeterminada para deshabilitar la edición para todas las celdas.
sateesh

150

Puede anular el método isCellEditable e implementarlo como desee, por ejemplo:

//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 para si su JTable desaparece

Si JTableestá desapareciendo cuando usa esto, lo más probable es que deba usar el DefaultTableModel(Object[][] data, Object[] columnNames)constructor en su lugar.

//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
Esta es también la solución para hacer que los eventos de doble clic funcionen correctamente con JTable. Un doble clic normalmente es consumido por una celda cuando entra en modo de edición, y esto evitará que la celda lo haga y en su lugar enviará el doble clic al JTable. ¡Gracias por la solución, Nelson!
anacoreta

2
@Jop, entonces algo está mal en otra parte de su código: una tabla nunca desaparece solo porque el modelo de la tabla no es editable ...
kleopatra

1
@DougHauf parece que no conoce Java, o realmente ningún lenguaje tan bien, ya que la mayoría de los lenguajes usan la misma sintaxis para operaciones booleanas ... que devuelve un booleano ... Le recomendaría que busque un Java muy básico tutorial y empezar desde el principio. Tratar de saltar al swing de esta manera terminará aprendiendo todo mal.
seekchengine27

1
@DougHauf, == es un alias para la función Equals que compara los objetos (a la izquierda y a la derecha) y devuelve un valor booleano. Supongo que ha usado la declaración si eso evalúa booleanos y generalmente se usa con este tipo de expresiones, por ejemplo, si (a == b) hacer algo. Intente imprimir a == bo simplemente asigne esto para una variable y comprenda el resultado.
nelson eldoro

1
La solución anterior tampoco me funciona. Hace que la columna y los elementos de datos de la tabla desaparezcan. Mi tabla se crea con table = new JTable (tempTable, columnNames) ;, donde tempTable es una Cadena [] [] y Nombres de columna es una Cadena []. Creo que el problema se debe a que el nuevo DefaultTableModel () no especifica los nombres de datos y columnas para el modelo de tabla. ¿Cómo los especifico en el modelo de datos? Intenté table.setModel (tableModel (tempTable, columnNames)) ;, pero eso provoca un error de "no se puede encontrar el símbolo".
user1164199

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

2
Ésta es la mejor y más sencilla respuesta. Por supuesto, debe configurar el editor en nulo para que no pueda editarlo.
LEMUEL ADANE

Esto funciona muy bien con la selección única. Cual fue mi requerimiento.
Wesos de Queso

¡Esta debería ser la RESPUESTA!
KrishPrabakar

36

solo agrega

table.setEnabled(false);

Funciona bien para mí.


1
¡Esto es genial si no estás usando un modelo de mesa personalizado!
Kingsolmn

26
Pero no podrá seleccionar una celda o fila.
tianz

3
Esto se verá "atenuado" en algunas L & F.
stommestack

2
Eso funciona. Gracias. Sin embargo, todavía me gustaría saber por qué el método del modelo de datos de nelson hace que la columna de la tabla y los elementos de datos desaparezcan.
user1164199

1
¡Funciona bien para mí!
Colby Cox

10

Si está creando el TableModel automáticamente a partir de un conjunto de valores (con "new JTable (Vector, Vector)"), quizás sea más fácil eliminar editores de columnas:

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
}

Sin editores, los datos no se podrán editar.


4
-1 pirateo aleatorio en ubicaciones inapropiadas nunca es una opción
kleopatra

Por favor, ¿puede explicar por qué se trata de un "pirateo aleatorio en ubicaciones inapropiadas"? Según el documento setDefaultEditor () : "Si el editor es nulo, elimina el editor predeterminado para esta clase de columna".
Freesoft

sí, y vuelve al valor predeterminado para Objeto ;-) Por lo que realmente no deshabilita la edición (solo accidentalmente si una de las columnas es de tipo Objeto), también le faltan columnas que podrían tener un editor personalizado. Hay una API destinada a ser implementada para controlar la editabilidad de la celda, y esa es la del modelo. Todo lo demás es piratería y, como tal, inapropiado.
kleopatra

Entiendo tu argumento. Pero lo que entendí de la API es que, si creo una tabla de forma rápida (con "new JTable (Vector, Vector)"), la tabla tendrá editores predeterminados para todas sus columnas. Por lo tanto, si ejecuto "table.setDefaultEditor (column, null)", eliminaré el editor predeterminado de la columna, por lo que la columna no tendrá ningún editor y la columna no será editable. ¿Lo será?
freesoft

Creé la tabla de esa manera new JTable(Vector, Vector)y funcionó para mí. No necesito editor en ninguna celda, así que tienes mi voto.
Dani Sancas


2

crear una nueva clase DefaultCellEditor:

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

y use setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.