MVC - zmiana contentu okna w zależności od klikniętego przycisku

0

Piszę prostą aplikacje okienkową (bazodanową) w Javie opartą o MVC, szkielet już mam. Teraz będę robił w widoku 4 buttony ( edycja kategorii, lista klientów, lista produktów, firmy). Po naciśnięciu danego przycisku zmienia się cały content w oknie. I zastanawiam się jak to sprawie rozwiązać czytałem o takim wzorcu DAO Factory. Jako layout chciałem wykorzystać CardLayout.

Pozdrawiam i proszę o radę.

0

http://vitalflux.com/steps-get-started-spring-mvc-4-hibernate-4/ - A hibernate wymień na jakikolwiek provider jeżeli chcesz.

0

Tak, tylko, że nie chce wykorzystywać Springa bo nie mam czasu na naukę nowej technologii i chce to zrobić wykorzystując czystą Jave, aby się wprawić dodam że jest to projekt na zaliczenie i nie chce używać to nie wiadomo jakich technologii.

0

A ja Ci każe wykorzystać którą z tych technologi ? Popatrz jak został tutaj zastosowany MVC, zresztą nie masz rączek żeby wstukać w google "MVC swing" ? - szkoda by mi było czasu czekać na odpowiedź w takim pierdołowatym temacie...

http://www.javaworld.com/article/2076632/core-java/mvc-meets-swing.html
http://stackoverflow.com/questions/4031433/dao-and-service-layer-with-hibernate

Jak CI to nie pomoże zastanów się nad zmianą zainteresowań.

0

Wstukiwałem w google, na tą stronę pierwszą co wysłałeś się natknąłem, ale jej nie przeanalizowałem. Zrobię to teraz, dzięki. A temat napisałem po to aby się czegoś dowiedzieć więcej ze względów architektonicznych opisując mój problem.

0

Ok. Poddaje się, chyba robię coś źle. Przy kompilacji nie dostaje errorów, ale dane się nie wyświetlają.

Application.java

package com.desing.demo1;

import java.sql.SQLException;

import javax.swing.SwingUtilities;

import com.desing.demo1.controller.Controller;
import com.desing.demo1.model.MySQLPersonDAO;
import com.desing.demo1.model.Model;
import com.desing.demo1.view.View;

public class Application {
	
	public static void main(String[] args)
	{
		SwingUtilities.invokeLater(new Runnable() {
			public void run()
			{
				try {
					runApp();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}
	
	public static void runApp() throws SQLException, Exception
	{
		Model model = new Model();
		View view = new View(model);
		Controller controller = new Controller(view, model); //kontroler slucha modelu i widoku
	}

}

Model.java

package com.desing.demo1.model;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Model {
	
	private Set<Person> people = new HashSet<Person>();
	
	public List<Person> getPeople() {
		return new ArrayList<Person>(people);
	}
	
	public void load() throws Exception {
		DAOFactory factory = DAOFactory.getFactory(DAOFactory.MYSQL);
		PersonDAO personDAO = factory.getPersonDAO();
		people.clear();
		people.addAll(personDAO.getPeople());
	}
}

Controller.java

package com.desing.demo1.controller;

import java.sql.SQLException;
import java.util.List;

import com.desing.demo1.model.MySQLPersonDAO;
import com.desing.demo1.model.Database;
import com.desing.demo1.model.Model;
import com.desing.demo1.model.Person;
import com.desing.demo1.model.PersonDAO;
import com.desing.demo1.view.AppListener;
import com.desing.demo1.view.CreateUserEvent;
import com.desing.demo1.view.CreateUserListener;
import com.desing.demo1.view.LoginFormEvent;
import com.desing.demo1.view.LoginListener;
import com.desing.demo1.view.View;

public class Controller implements CreateUserListener, AppListener {
	
	private View view;
	private Model model;
	
	private MySQLPersonDAO dbPersonDAO = new MySQLPersonDAO();
	
	
	public Controller(View view, Model model) throws SQLException, Exception {
		
		this.view = view;
		this.model = model;
	}

	public void userCreate(CreateUserEvent event) {
		// TODO Auto-generated method stub
		System.out.println("Login event " + event.getName() + ", " + event.getPassword());
		
	
	}
	
	public void getCategory() throws Exception{		 
		 model.load();
	}
	
	

	public void onOpen() {
		try {
			Database.getInstance().connect();
		} catch (Exception e) {
			view.showError("Cannot connect to database.");
		}	 
	}
 	public void onClose() {
		Database.getInstance().disconnect();
	} 
}

Fragment klasy mapującej

Person.java

public class Person {
	
	private int id;
	private String name;
	private String password;
	
	 
	public Person(int id, String name, String password)
	{
		this.name = name;
		this.id  = id;
		this.password = password;
	}
	public int getId() {
		return id;
	}
[...]

View.java

Tutaj chodzi o wywołanie metody categoryShow(), która się wywołuje, ale nie wyświetla danych

package com.desing.demo1.view;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import com.desing.demo1.controller.Controller;
import com.desing.demo1.model.Database;
import com.desing.demo1.model.Model;
import com.desing.demo1.model.Person;
import com.desing.demo1.view.CreateUserListener;

import java.awt.*;
import java.util.List;

import javax.swing.*;

public class View extends JFrame implements ActionListener,CategoryListener, CompanyListener, ClientsListener {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Model model;
	
	private AppListener appListener;
	private CategoryListener CategoryListener;
	private CompanyListener CompanyListener;
	private ClientsListener ClientsListener;
	
	private CreateUserListener createUserListener;
	
	private DefaultListModel<Person> listModel;
	private JList<Person> userList;

	
	JTabbedPane tabbedPane = new JTabbedPane();
	
	JPanel card1 = new JPanel();
	JPanel card2 = new JPanel();
	

	public View(Model model) throws HeadlessException {
		
		super("MVC Demo");
		this.model = model;
		
		listModel = new DefaultListModel<Person>();
		userList = new JList<Person>(listModel);

		addComponentToPane(getContentPane());
 		
		pack();
		setSize(600,500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);		
		
		addWindowListener(new WindowAdapter() {
			
		public void windowOpened(WindowEvent e)
		{
			
			fireOpenEvent();
			 try{
				 Database.getInstance().connect();
				 
			 }catch (Exception e1) {
				 JOptionPane.showMessageDialog(View.this, "Nie mozna sie polaczyc z baza danych","Error", JOptionPane.WARNING_MESSAGE);
				 e1.printStackTrace();
			 }
		}
		
		public void windowClosing(WindowEvent e)
		{
			fileCloseEvent();
			System.out.println("Zamknieto polaczenie ziomek");
			try{
				Database.getInstance().disconnect();
			}catch(Exception e2){
				JOptionPane.showMessageDialog(View.this, "Nie można zakonczyć połączenia z baza danych","Error", JOptionPane.WARNING_MESSAGE);
			}
		}		
		});		
		
	}
	private void fireOpenEvent() {
		// TODO Auto-generated method stub
		if (appListener != null) {
			appListener.onOpen();
		}
		
	}
	private void fileCloseEvent() {
		// TODO Auto-generated method stub
		if (appListener != null) {
			appListener.onClose();
		}		
	}
	public void addComponentToPane(Container pane)
	{		
	    tabbedPane.addTab("Lista kategorii", card1);
	    tabbedPane.addTab("Lista firm", card2);
		categoryShow();
		clientsShow();
		companyShow();	
        pane.add(tabbedPane, BorderLayout.CENTER);
	}
	public void setAppListener(AppListener appListener)
	{
		this.appListener = appListener;
	}
	public void setUserListener(CreateUserListener createUserListener) {
		// TODO Auto-generated method stub
		this.createUserListener = createUserListener;
	}
	public void showError(String string) {
		// TODO Auto-generated method stub
		System.out.println(string);
		
	}
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
		
	}
	public void clientsShow() {
		// TODO Auto-generated method stub
		
	}
	public void companyShow() {
		// TODO Auto-generated method stub
		
	}
	public void categoryShow() {
		// TODO Auto-generated method stub
 		
		System.out.println("out");
		listModel.clear();
		List<Person> people = model.getPeople();
		
		for (Person person : people) {
			listModel.addElement(person);
			System.out.println("przejscie");
		}
		card1.add(new JScrollPane(userList));
	}
}

Oraz klasa DAO

package com.desing.demo1.model;

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

public class MySQLPersonDAO implements PersonDAO{

	public List<Person> getPeople() throws SQLException
	{
		List<Person> people = new ArrayList<Person>();
		
		Connection conn = Database.getInstance().getConnection();
		
		System.out.println(conn);
		
		String sql = "select id, name, password from people";
		Statement selectStatement =  conn.createStatement();
		
		ResultSet results = selectStatement.executeQuery(sql);
		
		while(results.next())
		{
			int id = results.getInt("id");
			String name = results.getString("name");
			String password = results.getString("password");

			Person person = new Person(id, name, password);
			people.add(person);
		}
		
		results.close();
		selectStatement.close();
		
		return people;
		
	}

}


Edit:

Pacz z projektem http://www46.zippyshare.com/v/11932083/file.html

0

Wrzuć lepiej zip z projektem inaczej nie sądzę, że będzie się chciało komuś to czytać.

0

Kod nie jest za bardzo przejrzysty. Jeszcze spora droga przed Tobą :)

Problem masz w metodzie:

public void categoryShow() {
     //TODO tu leci NullPointer
     appListener.getCategory();
     System.out.println("out");
     listModel.clear();
     List<Person> people = model.getPeople();
		
     for (Person person : people) {
          listModel.addElement(person);
          System.out.println("przejscie");
     }
	
     card1.add(new JScrollPane(userList));
}

appListener jest nullem, ponieważ próbujesz się do niego odwołać przed przypisaniem do niego obiektu.

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