Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SwingWorker将数据从数据库加载到列表_Java_Swing - Fatal编程技术网

Java SwingWorker将数据从数据库加载到列表

Java SwingWorker将数据从数据库加载到列表,java,swing,Java,Swing,我的MVC应用程序在JTable中显示数据时遇到问题。一切正常,但我决定添加一个SwingWorker来从数据库检索数据 我的控制器使用数据库中的数据调用模型。看起来像这样 Model.java public class Model { private List<Category> people = new Vector<Category>(); public List<Category> getPeople() {

我的MVC应用程序在JTable中显示数据时遇到问题。一切正常,但我决定添加一个SwingWorker来从数据库检索数据

我的控制器使用数据库中的数据调用模型。看起来像这样

Model.java

    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类或数据库有问题。我很难从远处猜到。如果它以前工作过,请将代码并排比较,以便您可以看到不同之处。