Méthode utilisant ActionListener ET MouseListener
Résolu/Fermé
BlueKapotte
Messages postés
9
Date d'inscription
jeudi 11 février 2021
Statut
Membre
Dernière intervention
2 novembre 2023
-
Modifié le 21 avril 2021 à 09:35
BlueKapotte Messages postés 9 Date d'inscription jeudi 11 février 2021 Statut Membre Dernière intervention 2 novembre 2023 - 25 avril 2021 à 22:49
BlueKapotte Messages postés 9 Date d'inscription jeudi 11 février 2021 Statut Membre Dernière intervention 2 novembre 2023 - 25 avril 2021 à 22:49
A voir également:
- Méthode utilisant ActionListener ET MouseListener
- Juliette a modifié cette liste en utilisant le mode suivi des modifications proposé par le traitement de texte. - Guide
- La méthode range de l'objet worksheet a échoué ✓ - Forum VB / VBA
- En n'utilisant que le clavier quel mot obtenez-vous ✓ - Forum Windows
- En n'utilisant que le clavier, quel mot obtenez-vous ? ✓ - Forum Windows
- Méthode des tangentes excel ✓ - Forum Excel
3 réponses
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
23 avril 2021 à 09:17
23 avril 2021 à 09:17
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.
BlueKapotte
Messages postés
9
Date d'inscription
jeudi 11 février 2021
Statut
Membre
Dernière intervention
2 novembre 2023
1
23 avril 2021 à 21:07
23 avril 2021 à 21:07
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 !
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
24 avril 2021 à 07:36
24 avril 2021 à 07:36
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.
BlueKapotte
Messages postés
9
Date d'inscription
jeudi 11 février 2021
Statut
Membre
Dernière intervention
2 novembre 2023
1
25 avril 2021 à 22:49
25 avril 2021 à 22:49
C'est effectivement une solution plus simple, il faut que je regarde ça, ça peut grandement m'arranger.
Merci de la suggestion !
Merci de la suggestion !