База данных в GlazedList / Jtable, а затем редактировать базу данных через GlazedList / JTable - PullRequest
2 голосов
/ 26 января 2010

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

  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 Ответ

1 голос
/ 02 февраля 2010

У меня была очень похожая проблема, и я думаю, что мой результат был аналогичным, за исключением того, что он не нуждался в отражении (статическая схема БД). Вам необходимо создать объекты строки для каждой строки (которая может просто включать номер строки и ссылки на ResultSet и информацию о столбце).

Затем напишите реализацию ca.odell.glazedlists.gui.WritableTableFormat, чтобы сопоставить эти объекты с ячейками таблицы.

Чтобы избежать проблем с # 2, вы можете создать гибкий класс строк, который извлекает информацию столбца один раз из ResultSet и кэширует ее для повторного использования.

Редактировать: я нашел оригинальную и более простую реализацию (довольно простую), на которой была основана моя. Вы можете просмотреть его здесь: Таблица 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, как я предлагал выше?

...