Implementar ActionListener sem usar classe Anônima

Olá a todos no forum é o seguinte eu tenho este código:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class Janela extends JFrame implements ActionListener {
	private JButton bt1;
	private JButton bt2;
	
	public Janela() {
		super("Teste");
		this.setSize(150, 300);
		
		Container container= this.getContentPane();		
		container.setLayout(new GridLayout(2,1));
		bt1= new JButton("Botao 1");
		bt2= new JButton("Botão 2");
		container.add(bt1);
		container.add(bt2);
		bt1.addActionListener(this);
		bt2.addActionListener(this);
		this.pack();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// TODO Auto-generated constructor stub
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		JOptionPane.showMessageDialog(null, "Ação Botão 1");
		JOptionPane.showMessageDialog(null, "Ação Botão 2");
		// TODO Auto-generated method stub
	}
}

Ele simplesmente implementa o método da interface Action listener, e quando clico em qualquer um dos dois botões ele executa essas duas ações:

JOptionPane.showMessageDialog(null, “Ação Botão 1”);
JOptionPane.showMessageDialog(null, “Ação Botão 2”);

Mas o que eu queria era definir uma ação diferente no botão1, e outra no botão 2.

Eu sei fazer usando classe anonima, deste jeito:

bt1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				//Ação do botão 1;
				// TODO Auto-generated method stub
			}
		});

		bt2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent act) {
				//Ação do botão2
				// TODO Auto-generated method stub

			}

		});

Neste caso criei duas classes anônimas, agora como fazer utilizando a referência this da própria classe, ou eu teria que criar mais uma classe e usar a referência dela??

Quem puder me esclarecer melhor!

Obrigado!

Se você quer usar o this para referenciar a classe Janela na qual suas classes anônimas estam definidas, você pode usar Janela.this

Se a classe janela implementa actionlistener e ouve todos os eventos , vc pode usar o e.getSource() para distinguir entre os botões que geraram o evento. Mas isso é gambiarra por dois motivos:

  1. Os listeners devem ser inner classe. Se é anonima ou não é um detalhe de implementação.
  2. Não se deve usar if quando não precisa.

Então você pode criar uma action para cada botão , como inner classes de janela e usar Janela.this para se referir à janela em que os actions existem.
Ou vc pode criar uma classes especial que implementa actionlistener e tem como parametro do contrutor uma janela. E internamente vc usa a janela como um objeto qq. claro que se isto não for bem feito obriga a torna publicos um monte de atributos o que é tb uma gambiarra, mas ou menos não é uma inner class e não é anónima.

Obrigado pelas respostas!

Sérgio no caso da implementação com inner class, poderia ser desse jeito:

public class Janela extends JFrame {
	private JButton bt1;
	private JButton bt2;
	
	public Janela() {
		super("Teste");
		this.setSize(150, 300);
		
		Container container= this.getContentPane();		
		container.setLayout(new GridLayout(2,1));
		bt1= new JButton("Botao 1");
		bt2= new JButton("Botão 2");
		container.add(bt1);
		container.add(bt2);
		bt1.addActionListener(new bt1Click() );
		bt2.addActionListener(new bt2Click() );
		this.pack();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// TODO Auto-generated constructor stub
	}
	
	private class bt1Click implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			JOptionPane.showMessageDialog(null, "Ação do botão 1.");
			// TODO Auto-generated method stub	
		}
	} 
	private class bt2Click implements ActionListener {
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "Ação do botão 1.");
				// TODO Auto-generated method stub
			}
		}
}

Não entendi muito bem esta parte, pode me explicar melhor!!

Obrigado!

[quote=danielbussade]Obrigado pelas respostas!

Sérgio no caso da implementação com inner class, poderia ser desse jeito:
[/quote]

sim, é isso. Eu não uso isto, mas essa é a forma de usar inner classe se vc não quer que sejam anonimas.
Mas repare que se a classe apenas implementa Actionlistener não ha vantagem em ser não-anonima.

Quanto ao uso do Janela.this é

public class Janela extends JFrame {
	private JButton bt1;
	private JButton bt2;
	
              ...

	
	private class bt1Click implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			JOptionPane.showMessageDialog(null, "Ação do botão 1.");
			
                        // acessa algo em janela
                        // no caso desabilita o outro botão
                        Janela.this.bt2.setEnabled(false); 
		}
	} 
	
        
}

Realmente não tinha pensado por este ângulo, de que uma classe criada somenta para implementar interfaces, pode muito bem ser anônima.

Valeu Sérgio!

Att

    class ControleBotoes implements ActionListener {  
    @Override  
    public void actionPerformed(ActionEvent e) {  
        String a = e.getActionCommand();
        if("Botao 1".equalsIgnoreCase(a){
                      JOptionPane.showMessageDialog(null, "Ação do botão 1.");  
        }
        else if("Botao 2".equalsIgnoreCase(a){
                      JOptionPane.showMessageDialog(null, "Ação do botão 2.");  
        }
    }  
}   

Também funciona comparando as Strings que nomeiam os botões, usando if´s aninhados ou switch cases ! =)
Uma única classe pode definir ações para infinitos botões que se necessite implementar.