Java SwingWorker将数据从数据库加载到列表
我的MVC应用程序在JTable中显示数据时遇到问题。一切正常,但我决定添加一个SwingWorker来从数据库检索数据 我的控制器使用数据库中的数据调用模型。看起来像这样 Model.javaJava SwingWorker将数据从数据库加载到列表,java,swing,Java,Swing,我的MVC应用程序在JTable中显示数据时遇到问题。一切正常,但我决定添加一个SwingWorker来从数据库检索数据 我的控制器使用数据库中的数据调用模型。看起来像这样 Model.java public class Model { private List<Category> people = new Vector<Category>(); public List<Category> getPeople() {
public class Model {
private List<Category> people = new Vector<Category>();
public List<Category> getPeople() {
return new ArrayList<Category>(people);
}
public void load() throws Exception {
people.clear();
DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
CategoryDAO personDAO = factory.getCategoryDAO();
people.addAll(personDAO.getCategory());
}
}
public void load() throws Exception {
people.clear();
DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
CategoryDAO personDAO = factory.getCategoryDAO();
people.addAll(new MySQLCategoryDAO(Job.SELECT).execute()); - ERROR
}
当您在class Model.java中调用SwingWorker时,问题就出现了
public class Model {
private List<Category> people = new Vector<Category>();
public List<Category> getPeople() {
return new ArrayList<Category>(people);
}
public void load() throws Exception {
people.clear();
DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
CategoryDAO personDAO = factory.getCategoryDAO();
people.addAll(personDAO.getCategory());
}
}
public void load() throws Exception {
people.clear();
DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
CategoryDAO personDAO = factory.getCategoryDAO();
people.addAll(new MySQLCategoryDAO(Job.SELECT).execute()); - ERROR
}
错误:-
The method addAll(Collection<? extends Category>) in the type List<Category> is not applicable for the
arguments (void)
我知道SwingWorker没有返回任何内容,因为有一个错误。我应该用完成的方法编写代码,但我不知道如何解决它 execute没有返回值,因此无法以您尝试使用它的方式使用它。SwingWorker的想法是任务应该异步执行,因此您需要重新设计
SwingWorker会在列表中显示一个结果,您需要:
将结果放在SwingWorker内部的某个位置,例如使用发布机制
或者从外部调用get,等待任务完成并返回。
以下是供审阅的教程:
快速示例:
class MySQLCategoryDAO extends SwingWorker<Void, Category> {
// ...
private List<Category> list; // do not modify inside doInBackground
MySQLCategoryDAO(Job job, List<Category> list) {
this.list = list;
// ...
}
@Override
protected Void doInBackground() {
// ...
while(results.next()) {
int id = results.getInt("id");
String name = results.getString("name");
publish(new Category(id, name)); // publish results to the EDT
}
// ...
return null;
}
@Override
protected void process(List<Category> chunks) {
list.addAll(chunks); // add results to the list on the EDT
// add to the JTable (?)
}
}
public void load() throws Exception {
people.clear();
DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
CategoryDAO personDAO = factory.getCategoryDAO();
// just execute
new MySQLCategoryDAO(Job.SELECT, people).execute();
}
如果要一次填充整个表,还可以在循环后发布列表,而不是一次发布一个类别。进程将收到一个包含单数元素的列表。对不起,我的错误。
从视图获取model.getPeople,但不返回任何内容。我做了一个测试:
但是什么也没有归还
public class Model {
private List<Category> people = new Vector<Category>();
public List<Category> getPeople() {
for (Category person : people) {
System.out.println(person.getName()); //no data
}
return new ArrayList<Category>(people);
}
public void load() throws Exception {
people.clear();
DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
new MySQLCategoryDAO(Job.SELECT,people).execute();
}
}
好啊谢谢,它可以工作,但是在视图中people=model.getPeople;为空。我可以访问什么私有列表;从视图?您不访问SwingWorker中的私有列表,而是传入一个要修改的列表,然后从ModelgetPeople访问它。或者至少在我的例子中是这样的。如果getPeople返回null,那么您的代码与问题中显示的代码不同。返回新的ArrayListpeople;将永远不会返回null.Ok。当我调用函数getPeople-Model.java时,我没有得到任何数据。调用view model.getpeopleOK中的函数,可能是Category类或数据库有问题。我很难从远处猜到。如果它以前工作过,请将代码并排比较,以便您可以看到不同之处。