Comment puis-je envoyer par programmation ActionEvent à JButton?
Comment puis-je programmer l'envoi d'un ActionEvent
(par exemple, bouton enfoncé/ACTION_PERFORMED) à un JButton
?
Je connais:
button.doClick(0);
et
button.getModel().setArmed(true);
button.getModel().setPressed(true);
button.getModel().setPressed(false);
button.getModel().setArmed(false);
Mais n'est-il pas possible de l'envoyer directement un ActionEvent
?
EDIT: Ce n'est pas la production de code, c'est juste un peu d'expérience personnelle.
OriginalL'auteur Anon | 2011-01-20
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir un bouton
ActionListener
s, et ensuite appeler laactionPerformed
méthode directement.Concernant mon commentaire: est-ce que quelqu'un sait de quelque part où c'est documentée que vous pouvez supposer que votre ActionListener sera exécuté sur l'EDT?
C'est documentée ici: java.sun.com/products/jfc/tsc/articles/threads/... une Fois l'interface graphique est visible, la plupart des programmes sont pilotés par des événements tels que les actions de bouton ou de clics de souris, qui sont des toujours traitées en cas de distribution du fil à Partir de là on peut supposer qu'ils s'exécutent dans l'EDT.
OriginalL'auteur jjnguy
Même si vous le pouvez, pourquoi voudriez-vous? Généralement, quand les gens veulent faire quelque chose comme cela, cela signifie qu'ils ne sont pas correctement séparés les préoccupations de l'INTERFACE utilisateur de la logique métier. Généralement, ils veulent invoquer une certaine logique qui se produit dans un ActionListener sans avoir besoin de l'action à prendre place.
Mais, vraiment, la solution est d'extraire de cette logique de l'ActionListener et invoque à la fois la ActionListener et que le deuxième emplacement:
si vous downvote de bons conseils, même si elle contribue à l'OP a plus qu'une simple "répondre"? Ce n'est pas très utile.
Eh bien, oui, mais j'ai une bonne raison pour cela. Votre réponse n'est pas vraiment une réponse, un commentaire ( très bon ) , et il y a une place pour les commentaires juste en dessous de la question d'origine. Ce n'est pas personnel, bien sûr.
Eh bien, il était destiné à être une réponse en ce que il ya une bonne chance qu'il résout les OP problème (et si ce n'est l'OP que presque certainement quelqu'un à venir plus tard), si ce n'est leur question. Mais je trouve que vous avez besoin pour permettre des exceptions, même quand il doit s'agir d'un commentaire. Je ne pouvais pas l'avoir fait cette explication dans un commentaire en raison de limites techniques.
bien à vous ( il m'étonne que vous ne le sais pas, parce que vous n'êtes certainement pas un débutant ) Qu'est ce que la "communauté wiki"sont pour. Mais encore une fois, je n'ai pas l'intention de profiter de ce personnel. Donc, vous pourriez le "toucher" votre réponse afin que je puisse prendre mon downvote de retour? Vous aurez votre +2 pts. de retour et je vais obtenir mon +1 pt. i.imgur.com/CAgjP.png
OriginalL'auteur Mark Peters
Seulement si vous héritez et d'exposer le fireActionPerformed méthode, qui est protégé:
Alors vous serez en mesure, mais bien sûr, vous devez utiliser une référence comme ceci:
Pourquoi voudriez-vous faire cela? Je ne sais pas, mais je vous suggère de suivre Marc conseils
OriginalL'auteur OscarRyz
Si vous ne souhaitez pas appeler doClick() sur la touche, alors vous pouvez simplement appeler le code appelé par l'action du bouton. Peut-être que vous voulez pour n'importe quelle classe qui contient la méthode actionPerformed appeler une méthode publique que d'autres classes peuvent appeler, et de simplement appeler cette méthode.
OriginalL'auteur Hovercraft Full Of Eels
La pratique, le problème a été résolu, il me semble (voir Mark Peters et jjnguy de l' réponses). Et le
fireActionPerformed
méthode a également été déjà mentionné (voir OscarRyz réponse), pour éviter d'éventuels problèmes de concurrence d'accès.Ce que je voulais ajouter, c'est que vous peut appeler tous protégées et les méthodes (y compris
fireActionPerformed
), sans le besoin d'une classe de toutes les classes, à l'aide de la réflexion. Tout d'abord, vous obtenez la réflexionMethod
objet d'un privé ou protégé méthode avecmethod = clazz.getDeclaredMethod()
(clazz
doit être leClass
l'objet de la th de classe qui déclare la méthode, pas un de ses sous-classes (c'est à direAbstractButton.class
pour la méthodefireActionPerformed
, pasJButton.class
)). Ensuite, vous appelezmethod.setAccessible(true)
pour supprimer leIllegalAccessException
s qui autrement se produire lorsque vous essayez d'accéder à des méthodes privées ou protégées. Enfin, vous appelezmethod.invoke()
.Je ne sais pas assez sur la réflexion, cependant, pour être en mesure d'énumérer les inconvénients de l'utilisation de la réflexion. Ils existent, bien que, selon la API Reflection trail (voir la section "les Inconvénients de la Réflexion").
Ici quelques-code de travail:
OriginalL'auteur mkdrive2