У меня была очень похожая проблема, и я думаю, что мой результат был аналогичным, за исключением того, что он не нуждался в отражении (статическая схема БД). Вам необходимо создать объекты строки для каждой строки (которая может просто включать номер строки и ссылки на 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
, как я предлагал выше?