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

Posted

技术标签:

【中文标题】如果使用 SwingWorker 加载数据,何时将 TabelModel 绑定到 JTable?【英文标题】:When to bind TabelModel to JTable if the data is being loaded using a SwingWorker? 【发布时间】:2012-08-22 13:49:52 【问题描述】:

我正在使用 SwingWorker 使用此处建议的方法通过自定义 TableModel 将数据库中的数据加载到我的 JTable 中:How to fill data in a JTable with database?。如果我在继续处理 SwingWorker 中的 ResultSet 之前绑定我的 TableModel,我最终会在表模型中得到一个空列表,并且 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);

【问题讨论】:

“和 JTable 抱怨”...关于什么?? 好吧,它无法从支持模型的列表中获取任何值,因为该列表目前为空。 【参考方案1】:

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

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

    fireTableRowsInserted(firstRow, lastRow);


【讨论】:

以上是关于如果使用 SwingWorker 加载数据,何时将 TabelModel 绑定到 JTable?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 如何将 JProgressBar 与 SwingWorker 一起使用

何时使用多个笔尖?

延迟加载 - 它何时下载块文件?

何时使用 MongoDB [关闭]

SwingWorker 在方法 LockSupport.park() 中等待很长时间

Java中的SwingWorker [关闭]