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


97

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


Намного лучший ответ доступен здесь: stackoverflow.com/questions/9919230/disable-user-edit-in-jtable
Пол

Ответы:


22

Вы можете использовать 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());

1
У вас не может быть public voidметода, возвращающего логическое значение.
Geo

1
Также методisCellEditable
Мэтт

Указанный вами подход работает, но в AbstractTableModel нет такого метода, как isEditable. Существует метод isCellEditable (int, int), который принимает в качестве параметров rowIndex и coulmnIndex. Пользователь может выборочно включить / отключить редактирование для конкретной строки / столбца, переопределив метод isCellEditable, или может использовать реализацию по умолчанию, чтобы отключить редактирование для всех ячеек.
sateesh 02

150

Вы можете переопределить метод 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
Это также решение для правильной работы событий двойного щелчка с JTable. Двойной щелчок обычно используется ячейкой, когда она переходит в режим редактирования, и это удерживает ячейку от этого и вместо этого отправляет двойной щелчок в сам JTable. Спасибо за решение, Нельсон!
анахорет

2
@Jop, тогда что-то не так в другом месте вашего кода - таблица никогда не исчезает только потому, что модель таблицы не редактируется ...
kleopatra

1
@DougHauf, похоже, вы не знаете Java или действительно какой-либо язык, так как большинство языков используют тот же синтаксис для логических операций ... который действительно возвращает логическое значение ... Я бы порекомендовал вам найти очень простой Java учебник и начните с самого начала. Попытка прыгнуть в такой ход приведет к тому, что вы все поймете неправильно.
searchchengine27 01

1
@DougHauf, == - это псевдоним для функции Equals, которая сравнивает объекты (слева и справа) и возвращает логическое значение. Я полагаю, вы использовали оператор, если он оценивает логические значения и обычно используется с такого рода выражениями, например, если (a == b) что-то делает. Попробуйте вывести a == b или просто назначить это переменной и понять результат.
Нельсон Элдоро 01

1
Вышеупомянутое исправление также не работает для меня. Это приводит к исчезновению столбца таблицы и элементов данных. Моя таблица создана с помощью table = new JTable (tempTable, columnNames);, где tempTable - это String [] [], а имена столбцов - это String []. Я считаю, что проблема вызвана тем, что new DefaultTableModel () не указывает имена данных и столбцов для модели таблицы. Как указать их в модели данных. Я попробовал table.setModel (tableModel (tempTable, columnNames));, но это вызывает ошибку «не удается найти символ».
user1164199

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

2
Это лучший и самый простой ответ. Конечно, вы должны установить для редактора значение null, чтобы вы не могли его редактировать.
LEMUEL ADANE

Это отлично работает с одиночным выбором. Это было моим требованием.
Wesos de Queso

Это должен быть ОТВЕТ!
KrishPrabakar

36

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

table.setEnabled(false);

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


1
Это замечательно, если вы не используете нестандартную модель таблицы!
Kingsolmn

27
Но вы не сможете выбрать ячейку или строку.
tianz

3
В некоторых L&F это будет выглядеть "серым".
Stommestack

2
Это работает. Спасибо. Однако мне все же хотелось бы знать, почему метод модели данных Нельсона вызывает исчезновение столбца и элементов данных таблицы.
user1164199

1
У меня хорошо работает!
Colby Cox

10

Если вы создаете TableModel автоматически из набора значений (с помощью «new 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
}

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


4
-1 случайный взлом в ненадлежащих местах никогда не вариант
kleopatra

Объясните, пожалуйста, почему это «случайный взлом в неположенном месте»? Согласно документу setDefaultEditor () : «Если редактор имеет значение NULL, удаляет редактор по умолчанию для этого класса столбца».
FreeSoft

да, и возвращается к значению по умолчанию для Object ;-) Таким образом, вы на самом деле не отключаете редактирование (просто случайно, если один из столбцов имеет тип Object), также вам не хватает каких-либо столбцов, которые могут иметь собственный редактор. Там является апи предназначен для реализации на контроль клеточного редактируемости, и это модель. Все остальное взломано и как таковое неуместно.
kleopatra

Я понимаю вашу точку зрения. Но что я понял из api, так это то, что если я создам таблицу быстрым способом (с помощью «new JTable (Vector, Vector)»), то таблица будет иметь редакторы по умолчанию для всех ее столбцов. Итак, если я запустил «table.setDefaultEditor (column, null)», то я удалю редактор по умолчанию из столбца, поэтому в столбце не будет редактора, и столбец не будет редактироваться. Это случится?
freesoft

Я создал таблицу таким образом new JTable(Vector, Vector)и работал на себя. Мне не нужен редактор ни в одной ячейке, поэтому мой голос за вас.
Дани Санкас

3

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

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

2
Выбор невозможен.
h3xStream

Простое и красивое решение
Нуван Харшакумара Пияратна

Вопрос о том, что редактируемые не включены. Включение цели не решает
shaILU

2

создать новый класс 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()));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.