Duvida sobre tratamento de eventos

2 respostas
Enadrov

Boa tarde galera estou começando a mexer com tratamento de eventos e vi que exite varias formas de tratalos como:

meuBotao.addActionListener(new ActionListener{
public void actionPerformed(ActionEvent event){

});

ou criando uma subclasse pra cada evente, por exemplo se voce tiver dois botões voce cria 2 subclasse uma para cada evento ex:

public class Fechar implements ActionListener{
public void actionPerformed(ActionEvent ev){
//seu código
}
public class Limpar implements ActionListener{
public void actionPerformed(ActionEvent ev){
//seu código
}

e também uma outra forma usando subclasse que seria assim

faria assim na classe externar(classe principal)


EventoHandler handler ´= new EventoHandler();
textField1.actionListener(handler);
textField2.actionListener(handler);

ai criariamos essa subclasse e tratariamos esses eventos

private class EventoHandler implements ActionListener{ public void actionPerformed(ActionEvent event){ if(event.getSource() == textField1) //seu codigo else if (event.getSource() ==textField2) //seu codigo }
}

Bom duvia é a seguinte quando devo utilizar cada um desses exemplo, se tem um padrão se é a minha escolha, se depende do meu código?
Estou meio confuso em quando usar o que!

2 Respostas

ViniGodoy

O último caso nunca deveria ser usado. Além de gerar um código espaguetônico, tem perfomance pior.
Aliás, pense na idiotice do último caso:
a) Os componentes disparam eventos de maneira separada, para listeners distintos;
b) Você resolve usar um listener só, forçando-os a juntar o que estava separado;
c) Você usa um if para separar novamente, porque não tem como tratar eventos juntos.

Ou seja, você gera um código porco para tratar um problema que você mesmo criou.

Quanto aos dois casos anteriores. Bem, eventos de botões geralmente são simples o suficiente para não justificar a existência de uma classe nomeada separada. Eu só separaria a classe se lá tivesse algum tipo de parametrização. Por exemplo, no caso dos botões de uma calculadora, onde gostaríamos de adicionar na classe a informação de qual foi o valor do botão pressionado:

public class BotaoNumericoListener extends ActionListener {
   public int numero; //Um campo configurável
   
   public BotaoNumericoListener(int numero) {
      this.numero = numero;
   }

   public void actionPerformed(ActionEvent evt) {
       display.setText(display.getText() + numero);
       valorDisplay += 10*valorDisplay + numero;
   }
}
Aí sim, podemos fazer
btnUm.add(new BotaoNumeroListener(1));
btnDois.add(new BotaoNumeroListener(2));
btnTres.add(new BotaoNumeroListener(3));

Para ações simples, use as inner classes anônimas (seu primeiro caso). Geralmente, evita-se colocar o código de tratamento diretamente dentro da inner class, e sim, restringe-se a chamar uma função da classe principal ali. Isso facilita o reuso da ação, ao mesmo tempo que facilita o uso de JOptionPanes dentro do método (uma vez que o this, no método, volta a ser a janela, e não o objeto da inner class).

Se for repetir a mesma ação em vários locais (um menu, menu do botão direito e um botão, por exemplo), você deve é criar um filho de AbstractAction, e definir a ação ao seu botão ao invés de usar listeners:
http://download.oracle.com/javase/tutorial/uiswing/misc/action.html

Isso permite também a definição do texto do botão, ícone, tecla de atalho e outros aspectos que provavelmente serão repetidos para todos os locais da ação.

Enadrov

Valeu mesmo ViniGodoy entendi o que não e o que usar e quando usar.

Criado 8 de setembro de 2011
Ultima resposta 8 de set. de 2011
Respostas 2
Participantes 2