Как сделать JTable недоступным для редактирования

Как сделать JTable недоступным для редактирования? Я не хочу, чтобы мои пользователи могли редактировать значения в ячейках, дважды щелкнув их.

Ответ 1

Вы можете использовать TableModel.

Определите класс следующим образом:

public class MyModel extends AbstractTableModel{
    //not necessary
}

Фактически isCellEditable() по умолчанию false, поэтому вы можете опустить его. (см. http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html)

Затем используйте setModel() метод вашего JTable.

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

Ответ 2

Вы можете переопределить метод isCellEditable и реализовать по своему усмотрению например:

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

или

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

Примечание, если ваш JTable исчезает

Если ваш JTable исчезает, когда вы его используете, это, скорее всего, потому, что вместо этого вы должны использовать конструктор DefaultTableModel(Object[][] data, Object[] columnNames).

//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

просто добавьте

table.setEnabled(false);

он отлично работает для меня.

Ответ 4

table.setDefaultEditor(Object.class, null);

Ответ 5

Если вы создаете TableModel автоматически из набора значений (с помощью "нового JTable (Vector, Vector)" ), возможно, удалить редакторы из столбцов проще:

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
}

Без редакторов данные не будут редактироваться.

Ответ 6

создать новый класс DefaultCellEditor:

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

и используйте setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));

Ответ 7

Я использовал это, и он работал: он очень прост и отлично работает.

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