如果使用SwingWorker加载数据,何时将TabelModel绑定到JTable?

时间:2012-08-28 04:21:18

标签: java swing jdbc jtable swingworker

我正在使用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);

1 个答案:

答案 0 :(得分:2)

首先,我(个人)不会真正使用fireTableDataChanged()方法来实现此目的,它需要JTable完全重绘自身(包括列)。随着数据集的增长,这将大大增加重绘时间......

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

    fireTableRowsInserted(firstRow, lastRow);

}