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 楼答案
当您执行类似的操作时
然后
model1 = fff.model
行很可能在SwingWorker完成之前执行。execute
调用将导致工作在后台中完成,并且无论工作是否已经完成,下一行都将很好地执行一般的方法是在
done()
方法中使用模型,大致如下所示:(为此,您必须将
jTable3
的引用传递给SwingWorker,也就是说,将其传递给构造函数并将其作为字段存储在SwingWorker中)可能有更优雅的解决方案,但根据迄今为止提供的代码,这似乎至少是错误的原因和可能的解决方案