Як зробити JTable нередагованим


97

Як зробити JTableнередаговане? Я не хочу, щоб мої користувачі мали можливість редагувати значення в клітинках, двічі клацнувши їх.


Набагато краща відповідь доступна тут: stackoverflow.com/questions/9919230/disable-user-edit-in-jtable
Пол

Відповіді:


22

Ви можете використовувати a 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", або може використовувати реалізацію за замовчуванням, щоб вимкнути редагування для всіх комірок.
сатеш

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 підручник і починайте спочатку. Спроба стрибнути в такий гойдалки закінчиться тим, що ти навчишся все неправильно.
searchengine27,

1
@DougHauf, == - це псевдонім функції Equals, яка порівнює об'єкти (ліворуч та праворуч) і повертає логічне значення. Я припускаю, що ви використовували висловлювання, якщо воно обчислює логічні значення, і зазвичай використовується із виразами такого типу, наприклад, якщо (a == b) щось робить. Спробуйте надрукувати a == b або просто призначте це для змінної і зрозумійте результат.
Нельсон Ельдоро,

1
Наведене вище виправлення також не працює для мене. Це спричиняє зникнення стовпця та елементів даних таблиці. Моя таблиця створюється за допомогою table = new JTable (tempTable, columnNames) ;, де tempTable є рядком [] [], а імена стовпців - рядком []. Я вважаю, що проблема викликана новим DefaultTableModel (), який не вказує імена даних та стовпців для моделі таблиці. Як я можу вказати їх у моделі даних. Я спробував table.setModel (tableModel (tempTable, columnNames)) ;, але це викликає помилку "не вдається знайти символ".
user1164199

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

2
Це найкраща і найпростіша відповідь. Звичайно, вам потрібно встановити для редактора нуль, щоб ви не змогли його редагувати.
ЛЕМУЕЛ АДАНЕ

Це чудово працює з одним вибором. Що було моїм реквізитом.
Wesos de Queso

Це має бути ВІДПОВІДЬ!
KrishPrabakar

36

просто додайте

table.setEnabled(false);

у мене це прекрасно працює.


1
Це чудово, якщо ви не використовуєте власну модель таблиці!
Kingsolmn,

26
Але ви не зможете вибрати клітинку або рядок.
tianz

3
Це буде виглядати "сірим" у деяких L & F.
stommestack

2
Це працює. Дякую. Однак я все-таки хотів би знати, чому метод моделі даних Нельсона спричиняє нездатність стовпця та елементів даних таблиці.
user1164199

1
Для мене добре працює!
Колбі Кокс,

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 (стовпець, нуль)", то я видалю редактор за замовчуванням зі стовпця, тому стовпець не матиме жодного редактора, і стовпець не можна буде редагувати. Це буде?
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.