2

この問題を2つの質問に分けることができます。

  1. GlazedListデータベース(MS-Access)の内容を/に入れる最良の方法は何JTableですか?
  2. GlazedList/JTableに加えられた変更がデータベース(MS-Access)に反映されていることを確認するにはどうすればよいですか?

これが私が知っていることです:

  1. JDBCメソッドを使用してデータベースから情報を取得/操作する方法を知っています。
  2. GlazedListはリフレクションが必要なことを知っているので、データベース内のすべての列/フィールドを含むクラスを作成する必要があります。これはあまり拡張可能ではありません...

この問題を解決するための最良の方法は何ですか?

edit://クラスジェネレータを作成することができました。列見出しを取得し、インスタンスフィールドを作成します。これで#2が解決するはず ですhttp://pastebin.ca/1770996-クラスは作成されますが、リフレクションを正しく使用したとは思いません... edit2://コードを上から編集して機能します... http:/ /pastebin.ca/1776722

4

1 に答える 1

1

私は非常によく似た問題を抱えていました.リフレクション(静的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上で提案したようなことを行うのはどうですか?

于 2010-02-02T04:27:05.153 に答える