java - 如果使用 SwingWorker 加载数据,何时将 TabelModel 绑定(bind)到 JTable?

标签 java swing jdbc jtable swingworker

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

最佳答案

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

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

    fireTableRowsInserted(firstRow, lastRow);

}

关于java - 如果使用 SwingWorker 加载数据,何时将 TabelModel 绑定(bind)到 JTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12152742/

相关文章:

java - 文本字段 setBounds 函数不适用于特定 JFrame

RDJDBC::dbConnect 无法连接到 HiveServer2 (kerberos +sasl)

java - Dataweave 停止从输入负载端的查询中拾取 Java linkedList 数据

用户登录时 Java 启动程序(平台范围)

Java SwingWorker 不能在 main 方法中工作?

java - com.microsoft.sqlserver.jdbc.SQLServerException : Login failed for user 'sa'

java - 数据截断 : Incorrect datetime value: ''

java - Maven 没有使用服务器的 servlet-api 构建

java - 如何在 Tomcat 上制作服务器范围的过滤器?

java - 如何按 ":"对齐多行 JOptionPane 输出对话框消息?