[Ajuda] Relacionar o botão a interface. AddActionListener(this)
5 respostas
InsaneChess
Prezados, boa tarde.
Por favor me retirem a pequena dúvida abaixo.
button.addActionListener(this);
O que o parametro dessa linha significa?
Não intendi o significado do "this" ou o que esse método deseja ser informado como parametrô.
É correto afirmar que esse comando serve para criar uma "Relação" entre a Interface e o button, de modo que quando o botão efetuar um evento ative o método actionPerformed da Interface?
importjavax.swing.JButton;importjavax.swing.JFrame;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclassPrincipalimplementsActionListener{JButtonbutton;publicstaticvoidmain(String[]args){PrincipalPrin=newPrincipal();Prin.Go();}publicvoidGo(){JFrameMoldura=newJFrame();button=newJButton("Click-me!");button.addActionListener(this);Moldura.getContentPane().add(button);Moldura.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Moldura.setVisible(true);Moldura.setSize(300,300);}publicvoidactionPerformed(ActionEventevent){button.setText("O botao foi apertado!!!");}}
Esse método faz com que o botão, sempre que for clicado, chame o método actionPerformed do ActionListener que você passar por esse parâmetro.
No caso, o seu próprio JFrame é um actionListener (veja, você implementa a interface ActionListener e define um método actionPerformed).
Por isso, você chama “this”. É como se o frame dizendo “O actionlistener que vai receber o evento sou eu mesmo”.
Se você tiver vários botões, essa não é uma boa prática. O ideal seria criar uma inner class para cada botão:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
button.setText("O botao foi apertado!!!");
}
});
evertonsilvagomesjav
Simples, seu objeto vai procurar o evento na propria classe, ou seja o parametro passado ai tem que ser um ActionListener, como sua classe implementou um ActionListener, logo ele vai procurar esse evento na propria classe.
InsaneChess
Caso eu vá criar um botão em outra classe, e deseje após ele ser clickado que chame o método actionPerformed da classe Principal.
Eu teria de utilizar como parametrô a classe que herda a interface?
Algo assim: button.addActionListener(Principal); ?
Obrigado pela atenção de vocês!
evertonsilvagomesjav
acho melhor vc seguir a dica que o Vini te passou, e vc implementar o método addActionListener do botao.
ViniGodoy
Isso é possível. Tosco, mas possível.
Mas você pode compartilhar listeners quando vários botões fazem a mesma coisa. Por exemplo, você pode criar um actionListener só chamado “AbrirActionListener” e adiciona-lo ao botão abrir, ao menu abrir, ao popup menu abrir e a tecla CTRL+A.
Mesmo se houver uma pequena diferença, como no caso dos botões de uma calculadora (onde o funcionamento é praticamente o mesmo) é possível compartilhar o listener.
Só não é bom registrar o mesmo listener para vários botões se a ação dos botões for diferente. Aí vc será obrigado a fazer um for que testa pela origem do evento. O que torna o código uma salsicha pouco legível, de baixa performance e difícil de manter.