2017-02-10 1 views
0

J'essaie de séparer les actions autant que possible mais je rencontre le problème d'une action qui se déclenche avant l'autre. En ce moment j'ai un bouton qui a deux écouteurs d'action ajouté.Java Swing Multiple ActionListeners

JButton button = new JButton(); 
... 
button.addActionListener (new Action1()); 
button.addActionListener (new Action2()); 

2 se passe avant 1. Comment puis-je garantir la commande? Existe-t-il un moyen d'avoir une action qui déclenche d'autres actions?

+0

Bien Vous pouvez utiliser des appels de méthode dans l'ordre que vous voulez dans ActionListener. – Lemonov

+0

Créer une troisième 'Action' qui prend une référence à' Action1' et 'Action2', appliquer cette troisième' Action' au bouton. Quand il est déclenché, il appellera Action1 et Action2 dans l'ordre que vous voulez. – MadProgrammer

+0

Je vois que vous êtes nouveau sur SO Si vous pensez qu'une réponse a résolu le problème, veuillez le marquer comme 'accepté' en cliquant sur le bouton vert marque. Cela permet de rester concentré sur les anciens posts qui n'ont toujours pas de réponses. –

Répondre

4

Habituellement, les sources d'événements ne garantissent pas l'ordre dans lequel les écouteurs sont notifiés. Et c'est pour une raison: le modèle/concept consiste à découpler le code d'écoute, c'est-à-dire que les auditeurs doivent être indépendants les uns des autres.

Si Action1 et Action2 ont vraiment besoin de coordonner leur travail, le code ne doit pas être réparti à deux endroits.

3

Si les deux actions dépendent de leur ordre, alors il s'agit d'une action. Je voudrais seulement enregistrer le premier actionlistener et appeler le second directement depuis le premier ou, mieux encore, écrire le code dans un seul actionlistener.

+0

Je suis probablement en train de penser à cela, mais comment lancez-vous une action dans une action? – SunLightGirl99

+0

@ SunLightGirl99 'class MyAction extends AbstractAction {Action subAction = ...; public void actionPerformed (ActionEvent e) {subAction.actionPerformed (e); }} ' –

+0

@ SunLightGirl99 Pourquoi voulez-vous déclencher une action? Normalement, vous voulez le faire ou vous voulez que Java Swing le fasse pour que cette action soit gérée de manière asynchrone avec votre interface graphique. Mais ici, dans votre première actionListener, vous êtes déjà asynchrone avec votre gui - alors, quel est le problème avec l'appel direct de la méthode de votre second actionListener? Je pense qu'il n'est pas nécessaire de lancer une action au lieu d'appeler la méthode directement! –