[RESOLVIDO] Por quê o ActionListener deste exemplo não funciona?

Estou estudando o Pattern MVC, mas estou sofrendo com uma questão de entendimento.

Classe Eventos

[code]
package estudoeventos;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

/**
*

  • @author User
    */
    public class Eventos{

    Gui gui = new Gui();

    public Eventos(Gui evento) {
    this.gui = evento;
    evento.bAcaoaddActionListener(new Evento());
    }

class Evento implements ActionListener{

@Override
public void actionPerformed(ActionEvent e) {
    JOptionPane.showMessageDialog(null, "A janela apareceu");
}

}
}[/code]

classe Visao


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

import java.awt.event.ActionListener;

/**
 *
 * @author User
 */
public class Gui extends javax.swing.JFrame {

    /**
     * Creates new form Gui
     */
    public Gui() {
        initComponents();
       
    }
//metodo próprio
    public void bAcaoaddActionListener(ActionListener evento){
        bAcao.addActionListener(evento);
    }
    
    /**
     * 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() {

        bAcao = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        bAcao.setText("acao");

        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(137, 137, 137)
                .addComponent(bAcao)
                .addContainerGap(208, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(129, 129, 129)
                .addComponent(bAcao)
                .addContainerGap(148, Short.MAX_VALUE))
        );

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

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton bAcao;
    // End of variables declaration                   
}

EstudoEventos

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

/**
 *
 * @author User
 */
public class EstudoEventos {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        Gui gui = new Gui();
        gui.setVisible(true);
    }
}

Gostaria de saber o porquê do bAcao não chamar a ação da classe eventos??? Muito obrigada por suas explicações.

Simples. Pq a GUI que você cria no main e exibe na tela não é a mesma Gui que você cria na classe Eventos.

São da mesma classe, mas são objetos diferentes.

Como assim?? Não é a mesma GUI?? Eu instanciei o Objeto e ela herda todas as características, não é mesmo?? Não entendi direito, mas poderia corrigir meu exemplo, e torná-lo funcional. Para eu comparar os dois???

Obrigado.

Tens uma cadela. De cada vez que ela parir (new Cachorro), o filho vai ser sempre o mesmo? Ou ser sempre a mãe?

Se eu tenho um Ka 1.0 vermelho, e você tiver um Ka 1.0 vermelho. Mesmo eles tendo o mesmo modelo e ano, eles serão o mesmo carro?
Cada vez que você dá um “new” você fabrica um novo objeto. Portanto, você tem duas telas idênticas, mas uma está sendo exibida, e na outra você está colocando o listener.

Esse é um conceito básico da OO, chamado de identidade:
http://www.batebyte.pr.gov.br/modules/conteudo/conteudo.php?conteudo=1863

  1. Vamos deixar a classe eventos só recebendo a gui de fora:

[code]package estudoeventos;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

public class Eventos implementa ActionListener {
private Gui gui;

public Eventos(Gui gui) {
    if (gui == null) {
        throw new IllegalArgumentException("É necessário uma GUI para os eventos!");
    this.gui = evento;
    evento.bAcaoaddActionListener(new Evento());
}

@Override
public void actionPerformed(ActionEvent e) {
    JOptionPane.showMessageDialog(null, "A janela apareceu");
}    

}
[/code]

Agora, no main, vamos passar a gui criada para a classe Eventos:

[code] public static void main(String[] args) {
// TODO code application logic here

    Gui gui = new Gui();
    Eventos ev = new Eventos(gui);
    gui.setVisible(true);        
}[/code]

Note que agora no código só há 1 new sendo dado na classe Gui.

Poxa!! Cara era isso mesmo, kkkkkkkkkkkkkkkkkkkk.

Minha lógica tá uma “M@$$$@@”, perdoa aí sou muito “prego”!!

Dois homens aqui (eu e meu cunhado, o cara do ka vermelho 1.0 (parece até piada, mas ele tem mesmo um ka 1.0 vermelho kkkkkkk)) tentando resolver essa questão e ela era relativamente simples. Muito obrigado mesmo, vou estudar este exemplo com bastante atenção!! Além de revisar o Java Básico.

Valeu ViniGodoy!!!