ActionListeners em cadeia

5 respostas
L

Boas pessoal,
tenho uma Jbutton com varios ActionListeners atribuidos a ele :

JButton.addActionListener( acçao1)
JButton.addActionListener( acçao2)
JButton.addActionListener( acçao3)
JButton.addActionListener( acçao4)

O problema é que ao executar as vezes a acção 1 devolve exception.

E eu gostaria de saber como é que eu impeço que as outras acções ocorram quando uma der uma exeption.

Resumindo, eu quero que ele so passe para a acção seguinte se a que a antecede for executada com sucesso.

Se alguma delas der uma exception ele nao execute a ActionListener seguinte.

A minha ideia era colocar em cada actionlistener uma instrução que chame a Actionlistener a seguir caso tudo corra bem , mas nao sei como fazer isso .

Obrigado desde ja!

5 Respostas

G

Oi Luis, tudo bom?

ActionListener é uma interface. Você poderia, por exemplo, criar uma classe nos moldes de:

public class ChainedWrapper implements ActionListener{

   private final List<ActionListener> listeners = 
                  new CopyOnWriteArrayList<ActionListener>();

   public void actionPerformed(ActionEvent e){
      for(ActionListener listener : listeners){
         try{
            listener.actionPerformed(e);
         }catch(Exception ex) { 
            // Código de tratamento de erros aqui...
            return;
         }
      }
   }
   
   public synchronized void addListener(ActionListener next){
      listeners.add(listeners.size());
   }
}

Daí você “monta” a cadeia de listeners do lado de fora, registrando apenas um ChainedWrapper com a instância de JButton.

ChainedWrapper cw = new ChainedWrapper();
cw.addListener( acçao1)
cw.addListener( acçao2)
cw.addListener( acçao3)
cw.addListener( acçao4)

jButton.addActionListener(cw);

Abraços,

L

Deixa ver se eu percebi !
Crio uma class que implementa ActioListners e crio dentro dela uma lista de ActioListeners é isso ? e depois em outra classe crio um objecto desta class que implenta os ActioListners e vou adicionando os ActioListners a esta Lista , depois acrescento esta lista ao meu botao ? como vou ter a certeza que quando um actiolistener falhar os outros nao vao correr ?

E voce acha que era melhor separar cada actiolistener em uma class ?

Eu vou tentar com este codigo, qualquer coisa vou postar !~

Obrigado desde ja !

G

O laço que percorre a lista de ActionListeners aborta caso haja uma exceção. Você só tem como garantir que se um ActionListener falhar então todos os que vem depois dele na ordem de inserção não vão executar. Para garantir que se um (qualquer) falhar então os outros não vão executar, você teria que implementar um algoritmo no estilo Two-Phase Commit, e teria que estender teus listeners de alguma outra forma.

Só se for conveniente. :slight_smile:

He he he. Tá legal. Eu nem tentei compilar isso aí. :slight_smile:

Até mais,

L

Ta me dando erro :
[code]
public synchronized void addListener(ActionListener next){
listeners.add(listeners.size()); // O ERRO É NESTA LINHA . DIZ QUE NAO ENCONTRA O SYMBOL
}
}

G

Ops, era:

listeners.add(listeners.size(), next);

Abraços,

Criado 1 de julho de 2006
Ultima resposta 3 de jul. de 2006
Respostas 5
Participantes 2