私は非常によく似た問題を抱えていました.リフレクション(静的DBスキーマ)が必要なかったことを除いて、結果も同様だったと思います. 行ごとに行オブジェクトを作成する必要があります (行番号、ResultSet および列情報への参照のみが含まれる場合があります)。
次に、ca.odell.glazedlists.gui.WritableTableFormat
これらのオブジェクトを表のセルにマップする実装を作成します。
#2 の問題を回避するために、ResultSet から列情報を 1 回フェッチし、再利用のためにキャッシュする柔軟な行クラスを作成できます。
編集:私が基づいていたオリジナルでより単純な実装(かなり単純)を見つけました。ここで表示できます: 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;
}
ただし、3 つの落とし穴があります。ResultSet は更新可能で、両方向のスクロールをサポートし、DB の更新に敏感である必要があります。これらは JDBC 仕様の一部ですが、すべてのドライバーがそれらをサポートしているわけではないため、それらを有効にして ResultSet を作成する必要があります。その場合は、this.fireTableDataChanged()
定期的にテーブル データの完全な更新を強制するだけです。これは最速のアプローチではありませんが、機能します。
Edit2:別のアプローチ
オブジェクト リレーショナル マッパー ライブラリの 1 つを使用して、ca.odell.glazedlists.gui.WritableTableFormat
上で提案したようなことを行うのはどうですか?