Filtro de eventos nos listeners [Resolvido]

6 respostas
doug

Olá Amigos

Gostaria de saber se existe alguma forma de eu fazer um filtro de eventos nos listeners, por exemplo
   minha classe implementaria ActionListener e esse action pede a implementação de um metodo
   actionPerformed, ok... 

 Dai gostaria que esse actionPerformed passe pelo meu filtro primeiro para depois ser envocado, normalmente.
    É a mesma idéia do Filter no jee antes de chamar um servlet ou um action do struts.. tem modo de fazer isso??

Desde já agradeço
Flwssss

6 Respostas

marcosharbs

hmmm não sei se tem como fazer que nem com servlet, mas vc poderia chamar seu filtro dentro do actionPerformed e ai so executa o conteudo dele se seu filtro retorna true por exemplo, só uma ideia nao sei comko vc esta implementando.

doug

Tentei fazer assim:

  • Minha Classe que iria filtra as ações:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public abstract class EventHandler implements ActionListener {
	
	public void eventPerformed(ActionEvent e){
		//inicializa conexão
		System.out.println("INICIOU EVENTO");
		actionPerformed(e);
		System.out.println("FINALIZOU EVENTO");
		// finaliza conexão
	}
	
	public void actionPerformed(ActionEvent e) {
		eventPerformed(e);
	}
}
  • Minha classe que iria produzir e consumir o evento:
import java.awt.event.ActionEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Teste {

	public static void main(String[] args) {
		new Teste();
	}
	
	public Teste() {
		JFrame frame = new JFrame();
		JButton button = new JButton("ok");
		button.addActionListener(new EventHandler(){
			public void eventPerformed(ActionEvent e) {
				super.eventPerformed(e);
				
				System.out.println("TAH NA CLASSE TESTE");
				
			}
		});
		frame.add(button);
		frame.setVisible(true);
	}
}

Mais esta fazendo um loop da morte!!! srsrsrsrs
Também gostaria de fazer com que essa classe teste implementasse… mas tudo bem… qualquer sugestão é válida!!!

Flwsss

renzonuccitelli

Vejo algumas maneiras de fazer isso.

1) implemente o ActionListener em uma classe abstrata que receba seu filtro no construtor, e que possua o filtro como atributo. Seu filtro, poderia ser, por exemplo, uma interface com o método boolean verify(), de forma que vc pudesse implementar diferentes filtros. Entao em sua classe asbtrato, vc criaria o método execute() ou alguma coisa do gênero, que seria a acao a ser executada.
Vai um exemplo:

public abstract class AcaoComFiltro implement ActionListener{
private Filtro filtro;

public AcaoComFiltro(Filtro filtro){
this.filtro=filtro;
}

public void actionPerformed(ActionEvent e) {
              if(filtro.verify())
		           execute(e);
	}

public abstract void execute(ActionEvent e);

}

Outra forma seria definir filtros via Annotation+Reflection para evitar os if´s que o padrão Observer nos obriga a criar em Java. Esse foi o tema do meu TCC que eu resolvi, como exemplo, no JColtrane para evitar as cascatas de if´s no uso do SAX.

Enfim, acho que a primeira é mais simples para o que vc quer, mas derrepente vc pode dar uma olhada na segunda para coisas mais complicadas...

A propósito, a classe que vc fez fica em loop pq um método fica chamando o outro em seu escopo, ocasionando um ping pong sem fim :twisted:

doug

Putz… é verdade, nem tinha visto!!! Isso… ontem tinha tentado algumas coisas
mas logo desisti, vou tentar o que vc falou (primeira solução) e achei muito
interessante essa API JColtrane…

Muito obrigado pela dica
Flwsss

doug

Opa!!! Ueba!!!
Funcionou certinho!!! Legal… gostei deste jeito
tinha feito um de extends… não tinha gostado muito, pois se uma classe já extendida
dai tinha que fazer várias coisas… deste jeito que vc me falou saiu perfeito…

Brigaduuuuuuuuuuuuuu

renzonuccitelli

Legal que vc tenha conseguido. Repare que vc pode também usar um var args no construtor para inserir vários filtros em vez de um só. As vezes vc pode querer criar várias condições. Aí bastaria ver se todas as condições dos filtros são atendidas.

Criado 5 de janeiro de 2009
Ultima resposta 6 de jan. de 2009
Respostas 6
Participantes 3