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: