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

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


person Siddharth Raina    schedule 02.01.2010    source источник
comment
Гораздо лучший ответ доступен здесь: stackoverflow.com/questions/9919230 / disable-user-edit-in-jtable   -  person Paul    schedule 01.06.2015


Ответы (7)


Вы можете использовать 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());
person JCasso    schedule 02.01.2010
comment
У вас не может быть метода public void, возвращающего логическое значение. - person Geo; 02.01.2010
comment
Также метод isCellEditable - person Matt; 02.01.2010
comment
Хотя указанный вами подход работает, в AbstractTableModel нет такого метода, как isEditable. Существует метод isCellEditable (int, int), который принимает rowIndex и coulmnIndex в качестве параметров. Пользователь может выборочно включить / отключить редактирование для определенной строки / столбца, переопределив метод isCellEditable, или может использовать реализацию по умолчанию, чтобы отключить редактирование для всех ячеек. - person sateesh; 02.01.2010

Вы можете переопределить метод isCellEditable и реализовать как хотите, например:

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

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

table.setModel(tableModel);

or

//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 исчезает при его использовании, это, скорее всего, связано с тем, что вам нужно использовать _ 4_ вместо этого.

//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);
person nelson eldoro    schedule 28.06.2010
comment
Это действительно самое простое решение для тех, кому просто нужна модель таблицы по умолчанию, только не редактируемая. - person Gnoupi; 28.06.2010
comment
Это также решение для правильной работы событий двойного щелчка с JTable. Двойной щелчок обычно используется ячейкой, когда она переходит в режим редактирования, и это удерживает ячейку от этого и вместо этого отправляет двойной щелчок в сам JTable. Спасибо за решение, Нельсон! - person anchorite; 15.03.2012
comment
@Jop, то в другом месте вашего кода что-то не так - таблица никогда не исчезает только потому, что модель таблицы не редактируется ... - person kleopatra; 27.01.2014
comment
Разве это не так, как isCellEditable написано, чтобы возвращать истинное или ложное значение, а не возвращать столбец == 3. - person Doug Hauf; 27.02.2014
comment
@DougHauf, похоже, вы не знаете Java или действительно какой-либо язык, так как большинство языков используют тот же синтаксис для логических операций ... который действительно возвращает логическое значение ... Я бы порекомендовал вам найти очень простой Java учебник и начните с самого начала. Попытка прыгнуть в такой ход приведет к тому, что вы все поймете неправильно. - person searchengine27; 01.04.2015
comment
@DougHauf, == - это псевдоним для функции Equals, которая сравнивает объекты (слева и справа) и возвращает логическое значение. Я полагаю, вы использовали оператор, если он оценивает логические значения и обычно используется с такими выражениями, например, если (a == b) что-то делает. Попробуйте вывести a == b или просто присвоить это переменной и понять результат. - person nelson eldoro; 01.04.2015
comment
Вышеупомянутое исправление также не работает для меня. Это приводит к исчезновению столбца таблицы и элементов данных. Моя таблица создана с помощью table = new JTable (tempTable, columnNames);, где tempTable - это String [] [], а имена столбцов - это String []. Я считаю, что проблема вызвана тем, что new DefaultTableModel () не указывает имена данных и столбцов для модели таблицы. Как указать их в модели данных. Я пробовал table.setModel (tableModel (tempTable, columnNames));, но это вызывает ошибку не удается найти символ. - person user1164199; 27.08.2015

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

table.setEnabled(false);

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

person Siddhu    schedule 16.08.2012
comment
Это замечательно, если вы не используете нестандартную модель таблицы! - person Kingsolmn; 10.09.2012
comment
Но вы не сможете выбрать ячейку или строку. - person tianz; 31.03.2013
comment
В некоторых L&F это будет выглядеть серым. - person stommestack; 10.08.2013
comment
Это простейшее решение вопроса, который, как я понимаю, нужно задать. Что касается невозможности выбора ячеек и строк, может ли setCellSelectionEnabled() помочь? Я подозреваю, что отключенные цвета ячеек по умолчанию можно переопределить, по крайней мере, с помощью setOpaque(false) и использования содержащего цвет фона JPanel. - person Will Nielsen; 28.01.2014
comment
Это работает. Спасибо. Однако мне все же хотелось бы знать, почему метод модели данных Нельсона приводит к исчезновению столбца и элементов данных таблицы. - person user1164199; 27.08.2015
comment
У меня хорошо работает! - person Colby Cox; 12.12.2016

Если вы создаете 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
}

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

person freesoft    schedule 13.12.2013
comment
-1 случайный взлом в ненадлежащих местах никогда не вариант - person kleopatra; 27.01.2014
comment
Объясните, пожалуйста, почему это случайный взлом в неположенных местах? Согласно setDefaultEditor () doc: Если значение редактора равно нулю, удаляет редактор по умолчанию для этого класса столбца. - person freesoft; 27.01.2014
comment
да, и возвращается к значению по умолчанию для Object ;-) Таким образом, вы на самом деле не отключаете редактирование (просто случайно, если один из столбцов имеет тип Object), также вам не хватает каких-либо столбцов, которые могут иметь собственный редактор. Существует api, предназначенный для управления редактируемостью ячеек, и это модель. Все остальное взломано и как таковое неуместно. - person kleopatra; 27.01.2014
comment
Я понимаю вашу точку зрения. Но что я понял из api, так это то, что если я создам таблицу быстрым способом (с новым JTable (Vector, Vector)), тогда таблица будет иметь редакторы по умолчанию для всех ее столбцов. Итак, если я запустил table.setDefaultEditor (column, null), то я удалю редактор по умолчанию из столбца, поэтому в столбце не будет редактора, и столбец не будет доступен для редактирования. Это случится? - person freesoft; 28.01.2014
comment
Я создал таблицу таким образом new JTable(Vector, Vector) и работал на себя. Мне не нужен редактор ни в одной ячейке, так что мой голос за вас. - person Dani Sancas; 18.12.2014
comment
так что это сработает, если мы не добавили никаких пользовательских редакторов для столбцов. и так будет в большинстве случаев. зачем кому-то добавлять собственный редактор, а затем отключать его. только для одного случая, когда режим редактирования включается и отключается во время приложения. поездка. иначе ты в безопасности ?! - person hasan; 22.02.2015
comment
Настройка этого подхода позволяет выборочно включать / отключать редактирование по столбцам. - person Felype; 01.04.2015

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

JTable myTable = new JTable();
myTable.setEnabled(false);
person user3518835    schedule 27.01.2017
comment
Выбор невозможен. - person h3xStream; 14.07.2017
comment
Простое и красивое решение - person Nuwan Harshakumara Piyarathna; 24.06.2020
comment
Вопрос о том, что редактируемые не включены. Включение не решает цели - person shaILU; 27.06.2020

создать новый класс 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()));
person Ehsan Jelodar    schedule 23.07.2014

person    schedule
comment
Это лучший и самый простой ответ. Конечно, вы должны установить для редактора значение null, чтобы вы не могли его редактировать. - person LEMUEL ADANE; 01.04.2017
comment
Это отлично работает с одиночным выбором. Это было моим требованием. - person Wesos de Queso; 13.07.2017
comment
Это должен быть ОТВЕТ! - person KrishPrabakar; 22.11.2019