[Resolvido] Controller e View NETBEANS - Quero separá-los!

15 respostas
D

Olá pessoal!

Tudo certo??
Pessoal, eu gostaria de fazer o seguinte:
Quero que a minha classe que possui a interface não trate os eventos dos botões. Quero que estes sejam tratados em outra classe. O problema é que eu estou fazendo em Netbeans e o sistema é Desktop. Se eu criar um botão na interface e dar duplo clique para programar o que será feito caso este seja apertado, o código ficará no mesmo arquivo que está a minha interface.

O meu professor resolveu isso pra mim de duas maneiras diferente, a 1ª é menos "elegante" a 2ª é mais elegante só que não estou conseguindo fazer aqui!!
Bom, vou enviar o código da 1ª forma:

Pacote testecontroller
Arquivo Tela.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Tela.java
 *
 * Created on 10/03/2010, 17:42:23
 */

package testecontroller;

/**
 *
 * @author 58407
 */
public class Tela extends javax.swing.JFrame {

    /** Creates new form Tela */
    public Tela() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("OK");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(150, 150, 150)
                .addComponent(jButton1)
                .addContainerGap(201, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(132, 132, 132)
                .addComponent(jButton1)
                .addContainerGap(145, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed

    }//GEN-LAST:event_jButton1ActionPerformed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        Tela t = new Tela();
        t.setVisible(true);
        t.setControlador();
    }
    
    public void setControlador() {
        jButton1.addActionListener(new Controller());
    }



    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    // End of variables declaration//GEN-END:variables

}
Pacote testecontroller Arquivo: Controller.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package testecontroller;

import java.awt.event.ActionListener;

/**
 *
 * @author 58407
 */
public class Controller implements ActionListener {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            System.out.print("OK");
          }

}

Essa é a primeira forma, a segunda forma era algo mais ou menos assim: No botão na inteface em suas propriedades tem uma propriedade chamada "action" ali vai em "código personalizado" e coloca no textField new Controller()
Algo assim, bom, não lembro direito o que faço depois... Enfim, gostaria de saber se alguém sabe alguma forma de resolver isso desta forma, ou de alguma outra forma.

Muito obrigada pela ajuda!
Dina

15 Respostas

zoren

Existe uma propriedade que define onde ficará os códigos dos botões, se é numa classe interna ou em outra classe

Ferramentas > Opções > Miscelanea > Construtor de GUI

Na opção: Estilo gerador do Listener é só trocar o valor no combo

D

Olá! Obrigada pela resposta!

Mas tem as opções:
Classe interna única
Classes internas anônimas
Classe principal.

Testei as 3, e clicando duas vezes no botão o método

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }

é gerado na própria classe da interface.
Tem que fazer algo além disso?

zoren

Então

vc não pode setar um padrão desses num projeto que já foi iniciado, ele simplismente irá usar o antigo

se vc setar o classe interna unica, o netbeans irá criar uma classe interna que implementa a interface

se vc setar classe principal, sua classe irá implementar a interface

viniciusfaleiro

Pultz… Eu vejo um problema nessa concepção de separação do seu professor…

Não que esteja errado… más por exemplo… Se vc for usar seu controller em outro lugar que não seja em um botão vc necessáriamente vai ter q chamar o actionPerformed… A nomenclatura fica um tanto quanto esquisita…

Não seria melhor criar um pacote com seus controllers e instanciá-los dentro do actionPerformed?? Daí vc nem precisaria utilizar classes externas…

Acho que controller vc tem q pensar assim(um pouquinho de conceito de separação de camadas)… se vc fizer uma aplicação desktop e precisar depois fazer em web? Vai precisar reescrever???.. No seu caso quem não conhecer o código não vai saber o que o método ActionPerformed faz…

D

Aiii não to conseguindo…
Desculpa… mas… não sei…
:-o

Isso que vc tá me falando é pra separar:

  1. Interface em uma classe
  2. Tratamento dos botões em outra classe

É isso mesmo??
Pq se for, não está dando certo…
:-o

D

– Mensagem duplicada –

Hellmanss

Eu gosto de fazer assim:
Na interface grafica, vai no source e gera os Getters dos componentes que voce quer adicionar evendos. Quando vc for instanciar esse Form, tenha uma referencia dele e atravez dos geters dos componentes voce adiciona os eventos necessários.

Hellmanss

Fiz um Exemplo de uma maneira que pode ser implementado o que comentei anteriormente:

Classe gerada pela sua IDE, detalhe que foi adicionado o getter do botão

public class FormularioCadastr{
	private JButton btnSalvar;
	
	... implementação...
	
	public JButton getBtnSalvar(){
		return this.btnSalvar;
	}
}

Classe Que contem a referencia ao controlador e ao form

public class Handler{
	
	private FormularioCadastro form;
    private Controlador controlador ;
	
	public Handler(FormularioCadastr form){
		this.form = form;
        this.controlador = new Controlador();
		
		this.addEvents()
	}
	
	public void addEvents(){
		this.form.getBtnSalvar().addActionListner(new ActionListner(){
			Handler.this.salvar();
		});
	}
	
	public void salvar(){
                ......
		controlador.salvar(..);
	}
	
	...
}

Editado: Estava incorreto

peerless

Dina, já tive estas duvidas anos atrás. Para nao me repetir, veja aqui e aqui.

abraços!

D

Hellmanss, obrigada pela resposta e pelo exemplo, bom, eu fiz o seguinte:
Pacote testehellmans hehe
[b]Classe: FormularioCadastro

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * FormularioCadastro.java
 *
 * Created on 10/03/2010, 16:09:42
 */

package testehellmans;

/**
 *
 * @author Proprietário
 */
public class FormularioCadastro extends javax.swing.JFrame {

    /** Creates new form FormularioCadastro */
    public FormularioCadastro() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        btnSalvar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        btnSalvar.setText("Salvar");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(87, 87, 87)
                .addComponent(btnSalvar)
                .addContainerGap(250, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(142, Short.MAX_VALUE)
                .addComponent(btnSalvar)
                .addGap(135, 135, 135))
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        FormularioCadastro f = new FormularioCadastro();
        f.setVisible(true);
        Controlador c = new Controlador(f);
    }

    // Variables declaration - do not modify
    private javax.swing.JButton btnSalvar;
    // End of variables declaration

    /**
     * @return the btnSalvar
     */
    public javax.swing.JButton getBtnSalvar() {
        return this.btnSalvar;
    }

}

Classe Controlador

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package testehellmans;

import java.awt.event.ActionListener;

/**
 *
 * @author Proprietário
 */
public class Controlador{

	private FormularioCadastro form;

	public Controlador(FormularioCadastro form){
		this.form = form;

		this.addEvents();
	}

	public void addEvents(){
		this.form.getBtnSalvar().addActionListner(new ActionListner(){
			Controlador.this.salvar();
		});
	}

	public void salvar(){
		System.out.print("Salvo");
	}


}

Está dando erro nessa classe…
:frowning:
Se puder me ajudar, por favor…

D

peerless:
Dina, já tive estas duvidas anos atrás. Para nao me repetir, veja aqui e aqui.

abraços!

Peerless, darei uma olhada no tópico, obrigada!

Hellmanss

Bom fiz uma correção no meu post anterior.

Qual erro está ocorrendo?

D
run:

Exception in thread main java.lang.RuntimeException: Uncompilable source code

at testehellmans.Controlador.addEvents(Controlador.java:25)

at testehellmans.Controlador.(Controlador.java:21)

at testehellmans.FormularioCadastro.main(FormularioCadastro.java:66)

O erro está aparecendo nas linhas 2 e 3:

public void addEvents(){
             this.form.getBtnSalvar().addActionListner(new ActionListner(){
                    Handler.this.salvar();
             }); 
	}

Eu tava vendo que eu to chamando o método getBtnSalvar, correto?? Tem retorno, correto?? Onde estou guardando esse retorno??

Outra coisa, a sua 2ª mudança foi:

public void salvar(){

           controlador.salvar()
	}

assim começou a dar erro nessa linha,
eu tinha deixado:

public void salvar(){

            System.out.print("OK");
	}

Muito obrigada Hellmanss pela ajuda…

Hellmanss

Bom era só uma explicação de como deveria ser implementado.

Vou te passar o tua implementação funcionando:

package testehellmans;

public class FormularioCadastro extends javax.swing.JFrame {

    /** Creates new form FormularioCadastro */
    public FormularioCadastro() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        btnSalvar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        btnSalvar.setText("Salvar");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(87, 87, 87)
                .addComponent(btnSalvar)
                .addContainerGap(250, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(142, Short.MAX_VALUE)
                .addComponent(btnSalvar)
                .addGap(135, 135, 135))
        );

        pack();
    }// </editor-fold>

    // Variables declaration - do not modify
    private javax.swing.JButton btnSalvar;
    // End of variables declaration

    /**
     * @return the btnSalvar
     */
    public javax.swing.JButton getBtnSalvar() {
        return this.btnSalvar;
    }

}
package testehellmans;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FormularioHandler {
	
	private FormularioCadastro form;
//	private Controlador controlador;

	public FormularioHandler(FormularioCadastro form){
		this.form = form;
//		this.controlador = new Controlador()
		
		this.addEvents();
	}

	private void addEvents() {
		this.form.getBtnSalvar().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				FormularioHandler.this.salvar(); 
			}
		});
	}
	public void salvar(){
		System.out.println("Salvar");
//		this.controlador.salvar();
	}
	
	public static void main(String[] args) {
		FormularioCadastro form = new FormularioCadastro();
		form.setVisible(true);
		new FormularioHandler(form);
	}
}

Repare no construtor do FormularioHandler e no metodo main.

Nesse exemplo, o FormularioHandler é parte do view, considerado uma “ponte” entre o controlador e o View.

D

Hellmanss, muito obrigada!!
Obrigada mesmo!
Agora vou estudar “o que foi feito”…
Isso tava acabando comigo, fiquei parada nisso quase o dia todo…

Obrigada pela ajuda e paciência!
:wink:

Criado 10 de março de 2010
Ultima resposta 10 de mar. de 2010
Respostas 15
Participantes 5