Méthode utilisant ActionListener ET MouseListener
Résolu
BlueKapotte
Messages postés
9
Date d'inscription
Statut
Membre
Dernière intervention
-
BlueKapotte Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
BlueKapotte Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Méthode utilisant ActionListener ET MouseListener
- Une personne non-voyante utilise un logiciel qui lit les textes et décrit les images. sans utiliser de logiciel spécifique, trouvez, dans le document, comment s’appelle le chien de la photo. - Forum Handicap / Accessibilté
- Il semble que vous ayez abusé de cette fonctionnalité en l’utilisant trop vite. vous n’êtes plus autorisé à l’utiliser. - Forum Facebook
- Une personne non-voyante utilise un logiciel qui lit les textes et décrit les images. sans utiliser de logiciel spécifique, trouvez, dans le document, comment s’appelle le chien de la photo - Forum CSS
- Cliquez sur ce lien. en n'utilisant que le clavier, quel mot obtenez-vous ? ✓ - Forum Matériel & Système
- Compte Facebook temporairement verrouillé ✓ - Forum Facebook
3 réponses
Bonjour,
Lorsqu'un événement est déclenché, il appelle un Listener, et tout est bloqué tant que le Listener n'a pas fini de traiter l’événement. En particulier il n'est pas possible de recevoir un deuxième événement en parallèle, d'où ton problème.
Ce qu'il faut faire, c'est demander au Listener de créer une nouvelle tâche, un SwingWorker, et immédiatement terminer le Listener, sans attendre que la tâche soit terminée. Ce qui permet à la tâche créée de notamment gérer d'autres événements.
Voir https://rom.developpez.com/java-swingworker/
Remarque : ce ne sont pas les JPanel/JFrame qui devraient implémenter les Listener ce qui revient à faire des addListener(this) ce qui est conceptuellement bancal, car this est une fenêtre.
Il vaut mieux faire des classes séparées d'action qui vont implémenter les Listener et que tu vas ensuite ajouter à tes JPanel/JFrame.
Et comme ce sont des classes, tu vas pouvoir hériter d'autres classes, en particulier MouseAdapter qui implémente MouseListener.
Lorsqu'un événement est déclenché, il appelle un Listener, et tout est bloqué tant que le Listener n'a pas fini de traiter l’événement. En particulier il n'est pas possible de recevoir un deuxième événement en parallèle, d'où ton problème.
Ce qu'il faut faire, c'est demander au Listener de créer une nouvelle tâche, un SwingWorker, et immédiatement terminer le Listener, sans attendre que la tâche soit terminée. Ce qui permet à la tâche créée de notamment gérer d'autres événements.
Voir https://rom.developpez.com/java-swingworker/
Remarque : ce ne sont pas les JPanel/JFrame qui devraient implémenter les Listener ce qui revient à faire des addListener(this) ce qui est conceptuellement bancal, car this est une fenêtre.
Il vaut mieux faire des classes séparées d'action qui vont implémenter les Listener et que tu vas ensuite ajouter à tes JPanel/JFrame.
Et comme ce sont des classes, tu vas pouvoir hériter d'autres classes, en particulier MouseAdapter qui implémente MouseListener.
Merci beaucoup pour l'aide, ça m'a l'air rudement compliqué et je vais devoir me plonger la dedans. Va falloir redéfinir énormément de choses mais bon, j'avoue être un peu bloqué donc je ne pense pas avoir le choix.
Merci encore !
Merci encore !
En fait dans ton cas je pense que tu peux t'en sortir simplement.
Tu crées une classe CreerPointListener qui implémente l'ActionListener du bouton et le MouseListener du PanDessin.
Avec un attribut booléen dans la classe que tu initialises à false :
Tu crées une classe CreerPointListener qui implémente l'ActionListener du bouton et le MouseListener du PanDessin.
Avec un attribut booléen dans la classe que tu initialises à false :
- quand tu appuies sur le bouton tu le passes à true.
- quand tu clic sur le dessin tu regardes si le booléen est à false auquel cas tu ne fais rien, par contre s'il est à true tu enregistres la position du point, et tu repasses le booléen à false.