IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

comportement étrange MouseListener


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut comportement étrange MouseListener
    Mon logiciel me permet de créer et déposer des composants personnels, qui étendent JComponent sur un grand JComponent qui sert de support.
    Quand je clique sur un carré de couleur, je créé un composant, implanté verticalement, comme ci dessous :
    Nom : interV.png
Affichages : 89
Taille : 540 octets

    Quand de fais un click droit, sur cet élément, ce dernier pivote pour s'orienter horizontalement, comme ci-dessous :
    Nom : interH.png
Affichages : 81
Taille : 556 octets

    L'orientation de chaque objet est définie par le champ "vertical" de l'objet, positionné à "true" à chaque création.

    Le composant support principal, implémente mouseListener et oriente les appels en fonctions de l'action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    @Override
    	public void mouseClicked(MouseEvent e) { 
    		// rien
    	}
     
    	@Override
    			public void mousePressed(MouseEvent e) {
     
    				// PRESSION SOURIS EN CONCEPTION
    				if (Var.simul_en_cours == false) {
     
    						// bouton gauche => CREER ou EFFACER un composant
    						if (e.getButton() == MouseEvent.BUTTON1) {
    								Click_Gauche_Conception.clic_gauche(this.getMousePosition());
    						}
     
    						// bouton droit => ROTATION du composant
    						else if (e.getButton() == MouseEvent.BUTTON3) {
    								Click_Droit_Conception.clic_droit(this.getMousePosition(), i);
    						i++;
    						}
    				}
     
    				// PRESSION SOURIS EN SIMULATION
    				else if ( e.getButton() == MouseEvent.BUTTON1) {
    						Click_Simulation.pressed_g1_simulation(this.getMousePosition());
    				};
     
    				this.repaint();
    			}
     
     
    			@Override
    			public void mouseReleased(MouseEvent e) {
    				// RELACHEMENT SOURIS EN SIMULATION
    				if (Var.simul_en_cours == true && e.getButton() == MouseEvent.BUTTON1) {
    						Click_Simulation.released_g1_simulation(this.getMousePosition());
     
    				}
    				this.repaint();
    			}
     
    			@Override
    			public void mouseEntered(MouseEvent e) {
     
     
     
    			}
     
    			@Override
    			public void mouseExited(MouseEvent e) {
     
    			}
    Le problème apparait pour la gestion de l'orientation, suite à un click droit sur un objet, et un appel à la méthode : Click_Droit_Conception.clic_droit(this.getMousePosition(), i);
    l'entier "i" ne sert à rien dans le prg, mais sert pour le test.

    En effet, la methode appelée réalise ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    /----------- METHODE APRES "CLIC_DROIT" SUR GRILLE EN CONCEPTION ---------------
    	public static void clic_droit(Point p, int i) {
     
     
    		//--- Détection du component visé par le clic sur g1 ---
    		Component cible;
    		cible = Var.g1.findComponentAt(p);
    		System.out.println("  En mode CONCEPTION CLICL DROIT, le composant détecté est  : " + cible + " et i = " + i);
     
     
    			//--- Si GRILLE , traitement -> 		
    			if ( cible instanceof vue.Grille)  {
    				Menu_Action action = new Menu_Action();
    				action.show(Var.g1, p.x ,p.y);
    			}
     
     
    			//--- Si RECEPT, traitement -> modèle.MethR		
    			else if ( cible instanceof vue.Recept)  {
    					// "Caster" l'objet inconnu en type Recept
    					Recept r_test = (vue.Recept) cible;
    					System.out.println("ce recept est : " + r_test);
    			}
     
     
     
    			//---- SI C'EST SUR UN COMPOSANT STANDARD, ON PASSE PAR LE GESTIONNAIRE DE COMPOSANT
    			else if ( cible instanceof vue.composants.Composant) {
     
     
    								// on récupère l'orientation du composant
    								Composant test = (vue.composants.Composant) cible;
     
    								// On inverse l'orientation du composant
    								test.vertical = !test.vertical;
    								System.out.println("on vient de changer l'orientation, vertical = " + test.vertical);
    								JOptionPane.showMessageDialog(null,"on vient de changer l'orientation, vertical = " + test.vertical);
    			}
    	}
    //===================== fin de méthode après CLICK GAUCHE CONCEPTION ==================================================	
    }
    ICI, on s'intéresse au dernier "else if" car on a fait un click droit sur un objet de la classe Composant.

    Cela fonctionne très bien tant que je laisse le "JoptionPane", qui m'oblige à cliquer sur le message à chaque rotation, mais ça marche !

    Par contre, si j'enlève cet affichage, grâce à mon "i" incrémenté à chaque appel, je m'aperçois que ce nombre d'appel devient aléatoire, parfois 1 mais souvent 2,3, 4 pour un seul click droit.

    Pour ma part, je travaille avec "mousePressed", et même en maintenant mon click enfoncé, j'ai souvent déjà plusieurs appels pour ma fonction dédiée!!!

    Comment obtenir un seul appel sur clic droit sur composant, sans m'imposer cette fenêtre a cliquer de type JopotionPane, pour avoir de manière propre un seul appel suite à mousePressed????

    Merci pour vos idées....

  2. #2
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut pb appels successifs involontaire sur clic droit (btn3)
    Le problème des appels successifs sur un clic droit, semble apparaitre uniquement sur le bouton droit de la souris.

    En effet, si je maintiens le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if (e.getButton() == MouseEvent.BUTTON3 ) {
    								System.out.println("dans l'écouteur g1, on appelle clic_droit() passage n°" + i);
    								Click_Droit_Conception.clic_droit(this.getMousePosition());
    						i++;
    						};
    la méthode "clic_droit" est appelée plusieurs fois et i prend un nombre de valeurs multiples, et l'ensemble dysfonctionne donc.

    Si je change uniquement le "bouton3" de la souris par le "bouton2" (bouton du milieu), le code est pratiquement similaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if (e.getButton() == MouseEvent.BUTTON2 ) {
    								System.out.println("dans l'écouteur g1, on appelle clic_droit() passage n°" + i);
    								Click_Droit_Conception.clic_droit(this.getMousePosition());
    						i++;
    						};
    Le problème disparait!! Comme par miracle, à chaque "clic du bouton du milieu", la méthode "clic_droit" est lancée une seule fois et tout fonctionne !!!
    D'où peut provenir cet effet d'appel multiple ou unique, juste en modifiant le btn2 ou btn3 de la souris???

    Etrange, non??

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    C'est peu paraitre stupide, mais as tu essayé en changeant de souris, des fois que le bouton commencerait à être fatigué ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut pas stupide du tout
    un grand MERCI à toi, wax78 !!

    En effet, ma super souris, dont les boutons font un petit "clic" nickel, est en effet en cause, car sur le bouton de droite, elle valide un nombre compris entre 1 et 4 clic(s), quand moi, j'en fait un seul mécaniquement...

    J'ai branché une vieille souris usb de magasin low cost pour tester et en effet, le programme se comporte normalement, même avec le bouton de droite.

    Un grand merci car j'étais pris dans mes listener, click ou pressed ou released, et je n'aurais jamais pensé à changer tout bêtement de souris...

    Au moins, je comprends l'origine du problème, et ca, ca fait plaisir!!

    Merci d'avoir pris la peine de répondre..

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Avec plaisir.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Eh vi il faut pas non-plus sous-estimer les pannes du matériel. Pendant quelques temps, j'avais aussi un soucis récurrent sur mon nouvel ordi boulot ou toutes mes tentatives de clic droit + drag échouaient mi course... c’était juste la souris qui déraillait lors du drag avec le bouton droit enfoncé (toutes les autres actions sur le bouton de droit fonctionnaient correctement) et il a suffit de changer de souris pour régler le soucis.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo