База данных в GlazedList/Jtable, а затем редактировать базу данных через GlazedList/JTable
Я могу разбить эту проблему на два вопроса:
- Каков наилучший способ поместить содержимое базы данных (MS-Access) в
GlazedList
/JTable
? - Как мне убедиться, что все изменения, внесенные в
GlazedList
/JTable
отражаются в базе данных (MS-Access)?
Вот то, что я знаю:
- Я знаю, как извлечь / манипулировать информацией из базы данных, используя метод JDBC.
- я знаю это
GlazedList
Это требует отражения, поэтому мне нужно создать класс, который содержит каждый столбец / поле в базе данных. Это не очень расширяемый...
Каков наилучший способ решить эту проблему?
edit: // Мне удалось создать генератор классов. Он принимает заголовки столбцов и создает поле экземпляра. Это должно решить # 2 http://pastebin.ca/1770996 - Он создает класс, но я не думаю, что я правильно использовал отражение... edit2: // Отредактировал мой код сверху, чтобы он работал... http://pastebin.ca/1776722
1 ответ
У меня была очень похожая проблема, и я думаю, что мой результат был аналогичным, за исключением того, что он не нуждался в отражении (статическая схема БД). Вам необходимо создать объекты строки для каждой строки (которая может просто включать номер строки и ссылки на ResultSet и информацию столбца).
Тогда напишите ca.odell.glazedlists.gui.WritableTableFormat
реализация для сопоставления этих объектов с ячейками таблицы.
Чтобы избежать проблем с #2, вы можете создать гибкий класс строк, который извлекает информацию столбца один раз из ResultSet и кэширует ее для повторного использования.
Редактировать: я нашел оригинальную и более простую реализацию (довольно простую), на которой была основана моя. Вы можете просмотреть его здесь: Таблица результатов. Это может быть достаточно для ваших целей. Затем вы добавляете это в реализацию AbstractTableModel, предоставленную ссылкой.
public void setValueAt(Object ob, int row, int column) throws SQLException {
resultSet.absolute(r+1);
if (ob == null) {
resultSet.updateNull(column+2);
} else {
resultSet.updateObject(column+2,ob);
}
rs.updateRow();
this.fireTableCellUpdated(row,column);
}
public boolean isCellEditable(int row, int col) {
return true;
}
Однако есть три варианта: ваш ResultSet должен быть обновляемым, поддерживать прокрутку в обоих направлениях и быть чувствительным к обновлениям БД. Они являются частью спецификации JDBC, но не все драйверы поддерживают их, и вам нужно убедиться, что ваш ResultSet создан с их включенными. В этом случае вы просто делаете this.fireTableDataChanged()
периодически форсировать полное обновление данных таблицы. Это не самый быстрый подход, но он работает.
Edit2: другой подход
Как насчет использования одной из библиотек объектно-реляционного отображения, а затем сделать ca.odell.glazedlists.gui.WritableTableFormat
как я предложил выше?