有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在SwingWorker生成的EDT中使用tablemodel

我让Swingworker创建表格模型,以便在程序启动时更新jTable。但我不知道如何从EDT调用此模型,并将此模型应用于我的jtable

这里是我的Swingworker代码

public class FillTable extends SwingWorker<DefaultTableModel, DefaultTableModel> {
    private final DefaultTableModel model;
    public FillTable(DefaultTableModel model) {
     this.model = model;
    }

   @Override
 protected DefaultTableModel doInBackground() throws Exception {
        ResultSet rsaccounts;
        Statement stmt;
        String queryaccounts = "select NAME from acc (nolock)\n" + "order by Name";

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String connectionUrl = "jdbc:sqlserver://192.100.100.23;" + "databaseName=Dbacc;" + "user=" + "sa" + ";" + "password=" + "sapassword!" + ";"; 
        Connection con = DriverManager.getConnection(connectionUrl);
        stmt = con.createStatement();
        rsaccounts = stmt.executeQuery(queryaccounts);
        ResultSetMetaData rsmd = rsaccounts.getMetaData();


        Vector<String> columnNames = new Vector<String>();
        columnNames.add(rsmd.getColumnName(1)); 
        System.out.println(columnNames);
        int columnCount = rsmd.getColumnCount();

        Vector<Vector<Object>> data = new Vector<Vector<Object>>();

       while (rsaccounts.next()) {
            Vector<Object> vector = new Vector<Object>();
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
            vector.add(rsaccounts.getObject(columnIndex));
            }
            data.add(vector);
       }

        rsaccounts.close();
        stmt.close();
        model = new DefaultTableModel(data, columnNames);
        return model;
    }


  protected void done() {
    try {
        TableModel model = get();
    } catch (InterruptedException | ExecutionException ex) {
        ex.printStackTrace();
    }
  }

}

下面的方法返回错误; java线程“AWT-EventQueue-0”中出现异常。lang.IllegalArgumentException:无法设置空的TableModel

private DefaultTableModel model1;

FillTable fff = new FillTable(model1);
        fff.execute();
        model1 = fff.model;

        jTable3.setModel(model1);

共 (1) 个答案

  1. # 1 楼答案

    当您执行类似的操作时

    FillTable fff = new FillTable(model1);
    fff.execute();
    model1 = fff.model;
    jTable3.setModel(model1);
    

    然后model1 = fff.model行很可能在SwingWorker完成之前执行execute调用将导致工作在后台中完成,并且无论工作是否已经完成,下一行都将很好地执行

    一般的方法是在done()方法中使用模型,大致如下所示:

    protected void done() {
        try {
            TableModel model = get();
    
            jTable3.setModel(model); // Use it here!
    
        } catch (InterruptedException | ExecutionException ex) {
            ex.printStackTrace();
        }
    }
    

    (为此,您必须将jTable3的引用传递给SwingWorker,也就是说,将其传递给构造函数并将其作为字段存储在SwingWorker中)

    可能有更优雅的解决方案,但根据迄今为止提供的代码,这似乎至少是错误的原因和可能的解决方案