ここで提案されているアプローチを使用して、SwingWorker を使用してカスタム TableModel を介してデータベースから JTable にデータをロードしています: How to fill data in a JTable with database? . SwingWorker で ResultSet を処理する前に TableModel をバインドすると、テーブル モデル内に空の List が作成され、JTable が文句を言います。SwingWorker を呼び出した後にモデルをバインドすると、 JTable はpublish
、テーブル内の行を更新するメソッドによって起動されるコールバックの一部を見逃します。私のコードは次のようになります。
class MyTableModel{
ResultSet rs;
//Row is an intenral row object that is obtained after processing resultset
List<Row> data
MyTableModel(){
//initalise the row, rs etc;
}
public void updateData(List<Row> r){
data.addAll(r);
}
//called as a callback by another class that manages the queries
public void processResults(ResultSet rs){
new SwingWorker<Void,Row>(){
doInBackground(){
//process row by row
publish(row);
}
public void process(List<Row> chunks){
updateData(chunks);
fireTableDataChanged();
}
}.execute();
}
}
そして、これが私が今テーブルモデルを設定している方法です
MyTableModel m = new MyTableModel();
//pass m as callback to the database manager which invokes processResults() on m
dbm.makeQuery("SELECT bit,pat from bot;",m);
table.setModel(m);