База данных в GlazedList/Jtable, а затем редактировать базу данных через GlazedList/JTable

Я могу разбить эту проблему на два вопроса:

  1. Каков наилучший способ поместить содержимое базы данных (MS-Access) в GlazedList / JTable?
  2. Как мне убедиться, что все изменения, внесенные в GlazedList / JTable отражаются в базе данных (MS-Access)?

Вот то, что я знаю:

  1. Я знаю, как извлечь / манипулировать информацией из базы данных, используя метод JDBC.
  2. я знаю это 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 как я предложил выше?

Другие вопросы по тегам