3

ここで提案されているアプローチを使用して、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);
4

1 に答える 1

2

fireTableDataChanged()まず、私は(個人的には)この目的のためにメソッドを実際には使用しませんJTable。それ自体を完全に再描画する必要があります(列を含む)。これにより、データセットが大きくなるにつれて再描画時間が大幅に増加します...

public void updateData(List<Row> r){
    int firstRow = getRowCount();
    data.addAll(r);
    int lastRow = getRowCount() - 1;

    fireTableRowsInserted(firstRow, lastRow);

}
于 2012-08-28T04:36:47.427 に答える