2012-08-28 69 views
3

我正在使用SwingWorker通過自定義TableModel將數據從數據庫加載到我的JTable中,使用此處建議的方法:How to fill data in a JTable with database?。如果在繼續處理SwingWorker中的ResultSet之前綁定我的TableModel,那麼最終會在表模型中出現一個空List,JTable會抱怨。如果我在調用SwingWorker後綁定了模型,則我的JTable會錯過publish方法觸發的一些回調來更新表中的行。這裏是我的代碼如下所示:如果使用SwingWorker加載數據,何時將TabelModel綁定到JTable?

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); 
+0

「和JTable抱怨」...關於什麼? – MadProgrammer

+0

以及它是無法從列表中支持模型bacuse列表中的任何值列表是空的截至目前爲止。 – adi

回答

2

首先,我(個人)不會真的使用fireTableDataChanged()方法用於此目的,它將要求JTable完全重新繪製自己(包括列)。隨着數據集的增長,這將大大增加重繪時間...

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

    fireTableRowsInserted(firstRow, lastRow); 

} 
+0

感謝MadProgrammer會改變這一點。 – adi

相關問題