Swing: ouvintes ordem de execução no componente personalizado
Pergunta
O meu componente personalizado é composto por três JTree
s dentro de um JPanel
. Apenas um JTree
deve ser selecionado de cada vez, então eu adicionei um TreeSelectionListener
a cada um deles que as chamadas clearSelection
na JTree
previamente selecionado.
Eu gostaria de adicionar outros TreeSelectionListener
s aos JTree
s sendo certo que os ouvintes de manipulação selecção- sempre são executados primeiro. Eu prefiro não colocar tudo em um único TreeSelectionListener
.
O que devo fazer? Agradecemos antecipadamente!
Solução
Provavelmente você poderia cadeia deles, incluindo o novo ouvinte para o já existente, de modo a próxima vez que seu ouvinte é invocado que por sua vez irá encaminhar o evento para seus ouvintes.
// This is your current listener implementation
class CustomTreeSelectionListener implements TreeSelectionListener {
// listeners to which the even will be forwarded
private List<TreeSelectionListener> ownLIsteners;
public void addListener( TreeSelectionListener newListener ) {
ownListeners.add( newListener );
}
// add also removeListener( .... )
// TreeSelectionListener interface implementation...
public void valueChanged( TreeSelectionEvent e ) {
process( e ); // do what you do now
// Forward the message.
for( TreeSelectionListener listener : ownListeners ) {
listener.valueChanged( e );
}
}
}
Outras dicas
Nem uma solução muito boa, mas você pode quebrar o código em um SwingUtilities.invokeLater (...). Isto irá adicionar o código para o final do EDT, o que significa que acabará por executar após o outro código ouvinte tem executado.