У меня проблемы с обновлением данных JTable
.
Я реализую свой собственный TableModel
, расширяющийся от javax.swing.table.AbstractTableModel
, с помощью метода, который получает java.util.ArrayList<>
и обрабатывает его для создания Object[][]
, откуда считываются данные таблицы.
Логика следующая:
Я реализую JList с некоторыми ключами записей, когда пользователь выбирает один, запускается метод, который подбирает ключ и запрашивает базу данных MySQL для получения записей, связанных с этим ключом. Конечным результатом является ArrayList‹>, который я передал в TableModel для построения данных, а затем установил их в свою таблицу.
Работает нормально, но после нескольких нажатий перестает отображать табличные данные, а через некоторое время снова начинает работать. Я не уверен, что у меня проблемы с обновлением таблицы или всего графического интерфейса.
Это отрывок из кода:
Способ построения данных таблицы:
public void createTableData(java.util.ArrayList<Lote> alLote) {
//Lote is an entity class modeling the database table.
TABLE_DATA = new Object[alLote.size()][TABLE_COLUMNS.length];
//TABLE_DATA is an Object array, TABLE_COLUMNS is a String[] containing the names of the columns.
int i = 0;
for (Lote element : alLote) {
int j = 0;
TABLE_DATA[i][j++] = element.getFirstColumnValue();
//and so son
i++;
}
super.fireTableDataChanged();
}
При запуске GUI он начинается с пустого ArrayList‹>:
LoteTableModel ltm = new LoteTableModel();
arrayList = new ArrayList<Lote>();
ltm.createTableData(arrayList);
myTable = new JTable();
myTable.setModel(ltm);
scrollPane = new JScrollPane(myTable);
Кстати, я использую DesignGridLayout, RowGroup, который скрывает, когда в таблице нет записей, и показывает, когда в ней есть результаты, и JScrollPane в качестве контейнера таблицы.
dgl = new DesignGridLayout(panel);
dgl.row().center().group(group).add(scrollPaneContainingTable).fill();
centerPanel.add(panel, BorderLayout.CENTER);
getContentPane().add(centerPanel);
centerPanel.setVisible(true);
Затем каждый раз, когда пользователь выбирает элемент из JList, я запрашиваю базу данных и извлекаю записи, связанные с выбранным значением:
public void listSelectionChanged() {
bloque = alBloque.get(listBloque.getSelectedIndex());
//bloque is another entity, alBloque is an ArrayList<Bloque> from which the JList (named listBloque) ListModel is constructed.
try {
//database query here, omitted
if (result.getStatus() == SUCCESS) {
//the query returned a populated ArrayList<Lote>
alLote = result.getArray();
((LoteTableModel) myTable.getModel()).createTableData(alLote);
myTable.revalidate();
}
} catch (Exception e) {}
}
Как я уже говорил, он отлично работает пару раз, при нажатии на значения в списке отображаются связанные с ними записи в таблице, но затем, после нажатия нескольких, он вообще перестает отображать данные. Если оставить его на мгновение, а затем снова щелкнуть какое-либо значение, снова отобразятся правильные данные, поэтому, как я уже говорил ранее, я не уверен, что это больше похоже на проблему обновления графического интерфейса.
Любая помощь будет оценена.
java.io.IOException
иClassNotFoundException
. - person Noe   schedule 05.03.2013swings
. Просто поделился своим опытом. - person shriguru nayak   schedule 05.03.2013listSelectionListener
запускает поведениеvalueChanged
только тогда, когдаgetValueIsAdjusting
имеет значение false. - person Noe   schedule 05.03.2013