Livro Use a cabeça Java
Pagina 258.
Pessoal peguei esse código do livro… porém nao entendi o this
“button.addActionListener(this);”
que raio de this é esse? do action? como ele sabe disso? nao gosto de me sentir mágico rs rs fico meio perdido.
import javax.swing.*;
import java.awt.event.*;
public class SimpleGui1B implements ActionListener{
JButton button;
int n=0;
public static void main(String[] args) {
SimpleGui1B gui = new SimpleGui1B();
gui.go();
}
public void go(){
JFrame frame = new JFrame();
button = new JButton("Click me");
button.addActionListener(this);
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event){
n++;
button.setText("I've been clicked! "+n);
}
}
desde já agradeço. flw
Segundo… porque eu preciso implementar? diz a nota “o botão fornecerá eventos somente para quem implementar ActionListener”
Você implementou ActionListener ou seja tua classe passa a ser filha de ActionListener
Embora uma filha meio postiça. kkkkk
Isso quer dizer que ela receberá eventos (Ela é uma ouvinte de eventos).
Mas para receber estes eventos é necessário implementar afinal você só ligou a Interface que obriga você a seguir o modelo do ActionListener.
e o this, ora o this, informa ao botão que a sua classe é que vai ouvir e repassar os eventos.
Quando você cria uma classe JFrame e coloca nela um botão, você usa a mesma linha com this para
indicar que o JFrame é quem será o ouvinte (Listener) dos eventos.
Da mesma forma sua classe SimpleGui é uma classe ouvinte e ela passará ao botão os eventos que “ouvir”.
Acho que é isso, espero ter ajudado.
caraca que bagunça… na boa… tem que dividir tudo isso ai neh? kkk vou dar uma pesquisada melhor.
Bom dia a todos.
A sintaxe “this” é uma sintaxe recursiva que refere-se a um objeto da própria classe de onde está sendo declarada, e ela não é só utilizada para indicar o listener de eventos, vamos a um exemplo prático para voce entender melhor:
public class Qualquer {
private String mensagem = null;
public void setMensagem(String mensagem) {
/* Aqui voce vai reparar que este método
recebe um parâmetro de nome mensagem
que é igual o nome da variável atributo
mensagem da classe, só que eu quero
colocar o valor do parâmetro mensagem
dentro do atributo de classe mensagem
e eu utilizo o this para referenciar a classe
com o seu atributo, assim */
this.mensagem = mensagem;
}
}
Quando voce declarou a sua classe assim:
.....
public class SimpleGui1B implements ActionListener {
....
....
}
....
Significa que a sua classe está implementando um listener de evento ActionListener, cujos método ActionPerformed se encontra dentro de sua classe, e para que os componentes possa enxergar este método, dentro da sua própria classe, voce deve fazer asssinatura de seus eventos desta forma:
....
button.addActionListener(this);
....
Existe também uma outra maneira de assinar um evento nos componentes, porém esta maneira é ideal, caso voce tenha apenas tres ou no máximo cinco componentes que assinam eventos, que é criar um classe anônima dentro dos métodos de eventos dos próprios componentes, assim:
import javax.swing.*;
import java.awt.event.*;
public class SimpleGui1B {
JButton button;
int n=0;
public static void main(String[] args) {
SimpleGui1B gui = new SimpleGui1B();
gui.go();
}
public void go(){
JFrame frame = new JFrame();
button = new JButton("Click me");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event){
n++;
button.setText("I've been clicked! "+n);
}
});
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
}
Neste último caso, a sua classe não precisa implementar o listener (ouvinte) de evento.
Cappichi
cara vlw mesmo pela explicação eu entendi tudo oque voce disse. Mas digamos… e se fosse um programa que tivesse um mais e um menos… o mais encrementa e o menos decrementa… como ficaria? eu preciso criar dois listenner? senao… como vou saber que é um ou outro?
Boa tarde a todos.
Denisspitfire.
É simples, logicamente voce terá que implementar dois botões, um para incrementar e o outro, decrementar, certo.
Seguindo o seu post de eventos, ou seja, implementar o listener (ouvinte) de evento dentro da própria classe, ficaria assim o seu código:
import javax.swing.*;
import java.awt.event.*;
public class SimpleGui1B implements ActionListener {
private JButton btnmais, btnmenos;
private int n=0;
public static void main(String[] args) {
SimpleGui1B gui = new SimpleGui1B();
gui.go();
}
public void go(){
JFrame frame = new JFrame();
// Botões
btnmais = new JButton("Adiciona");
btnmais.addActionListener(this);
btnmenos = new JButton("Diminui");
btnmenos.addActionListener(this);
frame.getContentPane().add(btnmais);
frame.getContentPane().add(btnmenos);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
/* Aqui voce diferencia qual componente invocou o método
com o parâmetro event.getSource() que retorna um Object */
if (event.getSource() == btnmais) {
n++;
btnmais.setText("I've been clicked! "+n);
} else if (event.getSource() == btnmais) {
n--;
btnmenos.setText("I've been clicked! "+n);
}
}
}
Como voce declarou o JFrame dentro do método go, poderia também declarar os buttons lá dentro e fazer o actionPerformed enchergá-los através dos métodos setActionCommand e getActionCommand, desta forma:
import javax.swing.*;
import java.awt.event.*;
public class SimpleGui1B implements ActionListener {
private int n=0;
public static void main(String[] args) {
SimpleGui1B gui = new SimpleGui1B();
gui.go();
}
public void go(){
JFrame frame = new JFrame();
// Botão adicionar
JButton btnmais = new JButton("Adiciona");
btnmais.setActionCommand("Somar");
btnmais.addActionListener(this);
// Botão subtrair
JButton btnmenos = new JButton("Diminuir");
btnmenos.setActionCommand("Subtrair");
btnmenos.addActionListener(this);
frame.getContentPane().add(btnmais);
frame.getContentPane().add(btnmenos);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
/* Aqui voce diferencia qual componente invocou o método
com o parâmetro event.getSource() que retorna um Object */
JButton button = (JButton)event.getSource();
if (event.getActionCommand().equals("Somar") {
n++;
} else if (event.getActionCommand().equals("Subtrair") {
n--;
}
button.setText("I've been clicked! "+n);
}
}
Vale ressaltar que se voce instancia o seu Button desta forma:
JButton btnmais = new JButton("Adiciona");
Ele automaticamente configura o ActionCommand com o termo “Adiciona”, eu particularmente, por desencargo de consciência, prefiro utilizar o “setActionCommando” ou fazer referência o objeto button.
Um abraço.
1 curtida