Я работаю с расширением DefaultTableModel следующим образом:
Это NEW AchievementTableModel после обновления, чтобы отразить ввод некоторых ответов.
public AchievementTableModel(Object[][] c, Object[] co) {
super(c,co);
}
public boolean isCellEditable(int r, int c) {return false;}
public void replace(Object[][] c, Object[] co) {
setDataVector(convertToVector(c), convertToVector(co));
fireTableDataChanged();
}
Мой графический интерфейс представляет собой JTable со следующими свойствами:
if(table==null)
table = new JTable(model);
else
table.setModel(model);
table.setFillsViewportHeight(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.getTableHeader().setReorderingAllowed(false);
table.getTableHeader().setResizingAllowed(false);
table.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
table.getColumnModel().setColumnSelectionAllowed(false);
У меня есть JComboBox, который выбирает, какие данные отображать. TableModel обновляется вызовом model.replace(cells), а затем снова запускает приведенный выше код создания таблицы.
При выборе строки в GUI JTable и печати значения table.getSelectedRow() я ВСЕГДА получаю -1 после изменения данных таблицы с помощью вызова model.replace(cells) из первого выбора, даже если я повторно выбираю первый JComboBox вариант. Есть ли причина для этого, что мне не хватает? Должен ли я изменить какой-то код?
РЕДАКТИРОВАТЬ: Код сильно изменился, пытаясь ответить на этот вопрос, поэтому вот обновленный код. Новая модель AchievementTableModel приведена выше.
Это настраивает модель и таблицу для правильного просмотра и отображения в ScrollPane.
if(model==null)
model = new AchievementTableModel(cells, columns);
else
model.replace(cells, columns);
if(table==null) {
table = new JTable(model);
table.setFillsViewportHeight(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
table.getColumnModel().setColumnSelectionAllowed(false);
table.getTableHeader().setResizingAllowed(false);
} else
table.setModel(model);
column = table.getColumn(columns[0]);
column.setPreferredWidth(25);
column = table.getColumn(columns[1]);
column.setPreferredWidth(225);
column = table.getColumn(columns[2]);
column.setPreferredWidth(40);
table.doLayout();
add(new JScrollPane(table), BorderLayout.CENTER);