addActionListener

10 respostas
J

A pergunta é bem simples.
Porque eu devo colocar this quando eu adicio um Action Listener a um objeto ? Eu sei que é pra especificar aonde será tratado o evento, mas quais são as outras opções disponíveis ?

Tipo:

JTextField txt = new JTextField( 10 ); txt.addActionListener( this );

10 Respostas

caiofilipini

Você deve colocar this no addActionListener se a sua classe implementar a interface ActionListener. Se não, você tem que passar uma referência de um objeto que a implemente.

[]'s

caiofilipini

Esqueci de dar o exemplo! Aí vai:

1 - Caso a sua classe implemente ActionListener:
public class Teste extends JFrame implements ActionListener {
    ...
    JTextField txt = new JTextField(10); 
    txt.addActionListener(this); 

    public void actionPerformed(ActionEvent event) {
        ...
    }
}
2 - Caso a sua classe não implemente ActionListener. Você pode, por exemplo, criar uma inner class pra tratar os eventos:
public class Teste2 extends JFrame {
    ...
    ActionListener tratador = new TrataEventos();
    
    JTextField txt = new JTextField(10); 
    txt.addActionListener(tratador); 

    private class TrataEventos implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    }
}

Qualquer dúvida, volte a postar.

[]'s

luiz_ross

Ou usar a classe abstrata AbstractAction pra deixar o código menos emporcalhado com eventos

Daniel_Quirino_Olive

Ou então usar anonymous innerclass:

JTextField txt = new JTextField( 10 );
txt.addActionListener(new ActionListener(){
    //implemente aqui todos os métodos da interface ActionListener
    public void actionPerformed(ActionEvent e){
         // faz alguma coisa útil
    }
}
);
caiofilipini

Cheio de opções! :wink:

J

Ops… :wink: gostei mt do jeito normal com a referência sendo passada no caso que o Caio Filipini falou e o Daniel.

Só mais essa ok ?! :wink: Então eu poderia fazer uma classe só com tratadores de enveto importando a classe e assim evitando que o código ficasse cheio de eventos correto ?! Os listeners da vida ficariam em uma nova classe, isso pode ser feito ?

Obrigado :slight_smile:

luiz_ross

Sim, isso é possivel. Usando a classe abstrata AbstractAction ficaria assim
Sua classe que monta a interface

public class Tela extends JFrame{
      Acao acao = new Acao();
      private JButton botao ;

      public Tela(){
 
      botao = new Botao(acao);
      .
      .
      . }
}

Sua classe com o evento propriamente dito

public class Acao extends AbstractAction{
public Acao() { 
      putValue(SHORT_DESCRIPTION, "Testando o evento"); 
      } 

      public void actionPerformed(ActionEvent e) { 
                       
            System.out.println(" eheheh!!!!!!!! FUNCIONOU!!!!" );
      } 
}
caiofilipini

JBoy,

Note que no exemplo que dei, a classe tratadora de eventos é uma inner class, ou seja, uma classe definida dentro de outra classe. Dessa forma, ela tem acesso a todos os membros private da classe que constrói a GUI, ok?

[]'s

J

Ahhnnnn… 8) agora eu entendi o que significa AbstractAction. Eu ainda não sabia o que isso significava por isso não dei muita bola Luiz. Foi mal :P.

Muito legal esse tipo de tratamento de evento. No caso como eu tinha falado gostei muito de poder tratar o evento em uma classe diferente, assim importando ela pra poder se tratar. Como Luiz disse o código fica mais limpo e como Java é direcionado totalmente para Engenharia de Software acho que fica mais fácil de se achar o defeito, já que tudo esta em uma classe diferente.

Obrigado ai a vocês.

J

Muito bom este tópico :roll: , me ajudou muito.

Obrigado a todos :wink:

abraços.

Criado 7 de agosto de 2003
Ultima resposta 22 de fev. de 2011
Respostas 10
Participantes 5