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:
- Os listeners devem ser inner classe. Se é anonima ou não é um detalhe de implementação.
- 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.