Duvida com ActionListener

7 respostas
denisspitfire

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

7 Respostas

denisspitfire

Segundo… porque eu preciso implementar? diz a nota “o botão fornecerá eventos somente para quem implementar ActionListener”

JoaoBluSCBR

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.

denisspitfire

caraca que bagunça… na boa… tem que dividir tudo isso ai neh? kkk vou dar uma pesquisada melhor.

discorpio

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

denisspitfire

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?

discorpio

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.

denisspitfire

Cara vlw

Criado 20 de setembro de 2011
Ultima resposta 20 de set. de 2011
Respostas 7
Participantes 3