87 votos

Cómo hacer que un JTable no sea editable

¿Cómo hacer que un JTable no sea editable? No quiero que mis usuarios puedan editar los valores de las celdas haciendo doble clic en ellas.

139voto

nelson eldoro Puntos 749

Puedes anular el método isCellEditable e implementarlo como desees, por ejemplo:

// instancia del modelo de la tabla
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       // todas las celdas son falsas
       return false;
    }
};

table.setModel(tableModel);

o

// instancia del modelo de la tabla
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       // solo la tercera columna
       return column == 3;
   }
};

table.setModel(tableModel);

Nota si tu JTable desaparece

Si tu JTable desaparece cuando usas esto, es probablemente porque necesitas utilizar el constructor DefaultTableModel(Object[][] data, Object[] columnNames) en su lugar.

// instancia del modelo de la tabla
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       // todas las celdas son falsas
       return false;
    }
};

table.setModel(tableModel);

37voto

Siddhu Puntos 354

Solo agrega

table.setEnabled(false);

funciona bien para mí.

20voto

JCasso Puntos 2822

Puedes usar un TableModel.

Define una clase así:

public class MyModel extends AbstractTableModel{
    //no es necesario
}

en realidad isCellEditable() es false por defecto, por lo que puedes omitirlo. (ver: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html)

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

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

8voto

freesoft Puntos 138

Si está creando automáticamente el TableModel a partir de un conjunto de valores (con "new JTable(Vector, Vector)"), quizás sea más fácil eliminar los editores de las 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 serán editables.

2voto

Ehsan Horrible Puntos 51

Crear nueva clase DefaultCellEditor:

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

y usar setCellEditor:

JTable table = new JTable();
table.getColumn("nombreColumna").setCellEditor(new Editor_nombre(new JCheckBox()));

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X