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 :
Quand de fais un click droit, sur cet élément, ce dernier pivote pour s'orienter horizontalement, comme ci-dessous :
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 :
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);
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) { }
l'entier "i" ne sert à rien dans le prg, mais sert pour le test.
En effet, la methode appelée réalise ceci :
ICI, on s'intéresse au dernier "else if" car on a fait un click droit sur un objet de la classe Composant.
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 ================================================== }
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....
Partager