gpt4 book ai didi

java - 在EDT中使用SwingWorker生成的tablemodel

转载 作者:行者123 更新时间:2023-12-01 13:22:18 24 4
gpt4 key购买 nike

我有 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();
}
}

}

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

private DefaultTableModel model1;

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

jTable3.setModel(model1);

最佳答案

当你执行类似的事情时

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 中)。

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

关于java - 在EDT中使用SwingWorker生成的tablemodel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21956501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com