Ajuda a adequar a MVC

Eu estou tentando praticar um pouco MVC porém estou com algumas dificuldades

Eu tenho meu controller:

public class ControllerLogin implements ActionListener {

//view 
ViewLogin loginView;
FuncionarioDAO funcionario;

public  ControllerLogin(FuncionarioDAO f, ViewLogin l) {
	loginView = l;
	funcionario = f;
	actionListener(this);
}



// getters and setters do controller
public ViewLogin getLoginView() {
	return loginView;
}

public void setLoginView(ViewLogin loginView) {
	this.loginView = loginView;
}



@SuppressWarnings("unused")
@Override
public void actionPerformed(ActionEvent e) {
	try
	  {
	   //retrieve the input from View
	   @SuppressWarnings("unused")
	String a=loginView.getLogin().getText();
	   @SuppressWarnings("deprecation")
	String b=loginView.getPassword().getText();
	   boolean bx = funcionario.Autenticar(a, b);   
	   
	   
	  }
	  catch(Exception ee)
	  {
	   ee.printStackTrace();
	  }  
	
}
 public void actionListener(ActionListener ae)
 {
	 loginView.getEntrar().addActionListener(ae);
 }

}

meu view:

public class ViewLogin extends JFrame {

 Container con;

 private static final int FRAME_WIDTH = 400;
 static final int FRAME_HEIGHT = 350;

 static final int FRAME_X_ORIGIN = 150;
 static final int FRAME_Y_ORIGIN = 150;

 static final int BUTTON_WIDTH = 90;
 static final int BUTTON_HEIGHT = 30;

JPanel Logo;
JPanel Items;
JPanel Footer;
JLabel label1,label2;
private JTextField login;
private JPasswordField password;
private JButton entrar;
JButton registrar;
/**
 * Create the frame.
 */
public ViewLogin() {
	con=getContentPane();
    //Set the frame properties
    setSize         (FRAME_WIDTH, FRAME_HEIGHT);
   // setResizable    (false);
    setTitle        ("market v1");
    setLocation     (FRAME_X_ORIGIN, FRAME_Y_ORIGIN);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new FlowLayout());
    
    setLogin(new JTextField("",10));
    setPassword(new JPasswordField("",10));
    
    
    Items = new JPanel(new GridLayout(3,1));
    setEntrar(new JButton("Entrar"));
    getEntrar().setBounds(100, 285, BUTTON_WIDTH, BUTTON_HEIGHT);  
    registrar = new JButton("Registrar");
    registrar.setBounds(195, 285, BUTTON_WIDTH, BUTTON_HEIGHT);
    label1 = new JLabel();
    label1.setText("Username:");
    label2 = new JLabel();
    label2.setText("Password:");
    Items.add(label1);
    Items.add(getLogin());
    Items.add(label2);
    Items.add(getPassword());
    Items.add(getEntrar());
    Items.add(registrar);
    add(Items,BorderLayout.CENTER);
    setVisible(true);
}
public JTextField getLogin() {
	return login;
}
public void setLogin(JTextField login) {
	this.login = login;
}
public JPasswordField getPassword() {
	return password;
}
public void setPassword(JPasswordField password) {
	this.password = password;
}
public JButton getEntrar() {
	return entrar;
}
public void setEntrar(JButton entrar) {
	this.entrar = entrar;
}

}

creio que não seja preciso meu model
isso funcionou em partes:

porém os eventos do button eu não sei como por
eu tenho um button entrar que irá validar o login

alguém poderia me ajuda? como adicionar esse evento pelo controller ( e como pegar o que é digitado pelo user .)

alguém pff? Melhorei a questão .

O tratamento de eventos acontece na view.
Lá você tem um botão, adicionou um listener à ele e esse listener simplesmente vai avisar o controller sobre qual botão foi pressionado, aí o controller decide o que fazer.

você poderia me ajudar nisso? eu não estou conseguindo imaginar em como fazer isso .

Primeiro tira o ActionListener do seu Controller e implementa na sua própria tela utilizando inner class ou lambda.

public void adicionarOuvinteLogin (ActionListener ouvinte) {
	      this.entrar.addActionListener(ouvinte);
	      this.registrar.addActionListener(ouvinte);
}

seria algo parecido com isso na minha classe view?
Mas agora eu tou com dúvida em como chamar o meu metodo de validação na classe do controller

Não
Por que você criou getter e setters para os componentes da sua view? Não faz sentido.

Sua view deveria ter uma referência ao controller dela, justamente para poder fazer algo do tipo:

objetoController.pressioneiBotaoX();

a

eu consegui fazer dessa forma:

controller:

public class ControllerLogin {
	//view 
	private ViewLogin loginView;
	private FuncionarioDAO funcionario;
	private ActionListener actionListener;
	
	public  ControllerLogin(FuncionarioDAO funcionario,  ViewLogin loginView) {
		this.funcionario = funcionario;
		this.loginView = loginView;
	}

    public void contol(){        
        actionListener = new ActionListener() {
              public void actionPerformed(ActionEvent actionEvent) {                  
            	  validar();
              }
        };                
        loginView.getEntrar().addActionListener(actionListener);   
    }
    
    @SuppressWarnings("deprecation")
	private void validar(){
 		String a=loginView.getLogin().getText();
 		String b=loginView.getPassword().getText();
 		boolean bx = funcionario.Autenticar(a, b);  
    } 

main:

    public static void main(String[] args) {
		// TODO Auto-generated method stub
		ViewLogin view = new ViewLogin();
		FuncionarioDAO funcionario = new FuncionarioDAO();
		ControllerLogin controller = new  ControllerLogin(funcionario,view);
		controller.contol();
	}

e o meu view:

public ViewLogin() {
		con=getContentPane();
	    //Set the frame properties
	    setSize         (FRAME_WIDTH, FRAME_HEIGHT);
	   // setResizable    (false);
	    setTitle        ("market v1");
	    setLocation     (FRAME_X_ORIGIN, FRAME_Y_ORIGIN);
	    setResizable(false);
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    setLayout(new FlowLayout());
	    
	    setLogin(new JTextField("",10));
	    setPassword(new JPasswordField("",10));
	    
	    
	    Items = new JPanel(new GridLayout(3,1));
	    setEntrar(new JButton("Entrar"));
	    getEntrar().setBounds(100, 285, BUTTON_WIDTH, BUTTON_HEIGHT);  
	    registrar = new JButton("Registrar");
	    registrar.setBounds(195, 285, BUTTON_WIDTH, BUTTON_HEIGHT);
	    label1 = new JLabel();
	    label1.setText("Username:");
	    label2 = new JLabel();
	    label2.setText("Password:");
	    Items.add(label1);
	    Items.add(getLogin());
	    Items.add(label2);
	    Items.add(getPassword());
	    Items.add(getEntrar());
	    Items.add(registrar);
	    add(Items,BorderLayout.CENTER);
	    setVisible(true);
	}
	public JTextField getLogin() {
		return login;
	}
	public void setLogin(JTextField login) {
		this.login = login;
	}
	public JPasswordField getPassword() {
		return password;
	}
	public void setPassword(JPasswordField password) {
		this.password = password;
	}
	public JButton getEntrar() {
		return entrar;
	}
	public void setEntrar(JButton entrar) {
		this.entrar = entrar;
	}

não sei muito bem se é o modelo correto
vc poderia me ajudar com dicas de como melhorar isso?

Olá. Estou implementando um projeto no momento, usando o padrão de projeto MVC.
Se você quiser posso mandar um módulo (Login) e você vê como implemento o padrão e roda na sua máquina… Avise-me se tiver interesse…

opa mano tenho interesse sim se você poder eu fiz desse jeito, mas não sei se é a melhor maneira.

Qual seu email?

lo[quote=“lemosmoises, post:12, topic:390394, full:true”]
Qual seu email?
[/quote]

binnol2rvgh@gmail.com

Amanhã, te envio, vou precisar isolar parte do código… Amanhã analiso o seu melhor…

2 curtidas

blz vlw man .

Eu dei uma olhada no seu código. Acho que está correto sim. Você está implementando o padrão MVC do mesmo modo que eu. Aliás, acho que está no caminho correto, pois a maneira que fez segue a metodologia que eu vi no livro “Java com Programar” de Deitel…

Já fiz o envio do módulo de Login no seu email… favor verificar :wink:

1 curtida

vlw manin obrigado