Java SwingWorker ładowanie danych z bazy danych do Listy

0

Mam problem z mojej aplikacji MVC, który wyświetla dane w JTable. Wszystko działało dobrze, ale postanowiłem dodać SwingWorker do pobierania danych z bazy danych.

Mój kontroler nazywa model z danymi z bazy danych. Wygląda to tak.

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

}

Dodam SwingWorker do getCategory klasy MySQLCategodyDAO.java

public class MySQLCategoryDAO extends SwingWorker<Void, Vector<Object>> implements CategoryDAO{

    private Job job;
    private List<Category> cat;

    public MySQLCategoryDAO(Job job){
        this.job = job;
    }

    @Override
    protected Void doInBackground() throws Exception {
        // TODO Auto-generated method stub

        if(job == Job.SELECT){
            getCategory();
            System.out.println("Table selected");
        }       
        return null;
    }   
    @Override()
    public void done(){


    }

    public List<Category> getCategory() throws SQLException
    {
        cat = new ArrayList<Category>();
        Connection conn = Database.getInstance().getConnection();

        System.out.println(conn);

        String sql = "select id, name from kategorie";
        Statement selectStatement =  conn.createStatement();

        ResultSet results = selectStatement.executeQuery(sql);

        while(results.next())
        {
            int id = results.getInt("id");
            String name = results.getString("name");

            Category category = new Category(id, name);
            cat.add(category);
        }

        results.close();
        selectStatement.close();

        return cat;

    }
}

Widok pobiera tylko dane z modelu

people = model.getPeople();
        for (Category person : people) {
            tablemodel
                    .addRow(new Object[] { person.getId(), person.getName() });
        }

Problem zaczyna się, gdy chce wywołać SwingWorker w klasie Model.java

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
}

Error:

The method addAll(Collection<? extends Category>) in the type List<Category> is not applicable for the 
     arguments (void)

Wiem SwingWorker zwraca nic, dlatego jest taki błąd. Powinienem napisać kod w metodzie done(), ale nie mam pojęcia jak to rozwiązać.

0

Ok. Z pomocą udało mi się częściowo rozwiązać problem.

Problem teraz w tym, że nie wiem jak dostać się do danych z listy które są w klasie MySQLCategoryDAO.java. Najlepiej aby one były dostępne przez klase Model. Ma ktoś jakieś pomysły?
Nie wiem już jak kombinować.

Model.java

package com.magazyn.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class Model {
	
	public List<Category> people = new Vector<Category>();
	
	public List<Category> getPeople() {
		
		System.out.println("Jestem w getPeople() rozmiar = " + people.size());
		for (Category person : people) {
			System.out.println(person.getName()+"tutaj jestem");  
		}
		return new ArrayList<Category>(people);
	}
	
	public void load() throws Exception {
		people.clear();
		DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
		
		new MySQLCategoryDAO(Job.SELECT,people).execute();
	}
	
}

I MySQLCategoryDAO.java

package com.magazyn.model;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.SwingWorker;


public class MySQLCategoryDAO extends SwingWorker<Void, Category> implements CategoryDAO{

	private Job job;
	public List<Category> list;
	

	public MySQLCategoryDAO(Job job, List<Category> list){
		this.job = job;
		this.list = list;
	}
	
	
	
	@Override
	protected Void doInBackground() throws Exception {
		// TODO Auto-generated method stub
		
		if(job == Job.SELECT){
			getCategory();
			System.out.println("Table selected");
		}		
		return null;
	}	
	@Override()
	public void done(){
		
		 
	}
 	public List<Category> getCategory() throws SQLException
	{
 		Connection conn = Database.getInstance().getConnection();
		
		System.out.println(conn);
		
		String sql = "select id, name from kategorie";
		Statement selectStatement =  conn.createStatement();
		ResultSet results = selectStatement.executeQuery(sql);
		
		while(results.next())
		{
			int id = results.getInt("id");
			String name = results.getString("name");
 
			///Category category = new Category(id, name);
			//cat.add(category);
			publish(new Category(id,name));
			System.out.println("test");
		}
		results.close();
		selectStatement.close();
		
		return null;
		
	}
 	protected void process(List<Category> chunks){
 		list.addAll(chunks);
 		
 		for (Category person : list) {
			System.out.println(person.getName()); //mam tutaj te dane, wyświetlają sie
		}
  	}
 	
 	public List<Category> dawaj(){
 		return list;
 	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1