Bonjour à tous, je profite des vacances, pour travailler à nouveau sur mon logiciel de schéma électrique.
J'ai bien avancé, ça fonctionne pas mal, mais j'ai un problème concernant les listeners...
Mon interface ressemble à ça :
Le composant principal sur fond gris, est le support des autres composants qui s'implantent dessus peu à peu au fil de l'utilisation. (composants sur fond orange et fil en bleu par exemple ici)
C'est donc ce composant qui gère le "MouseListener", et le "MouseMotionListener" qui permettent de gérer les interactions de "click" et "Dragged" pour déplacer ou dimensionner des composants.
En effet, quand on clique, on identifie le composant présent à cet endroit de la grille et on oriente vers les procédures dédiées.
Le code est en partie ici :
Mon problème est le suivant :
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 // --- je clique sur g1 ---------------- @Override public void mouseClicked(MouseEvent e) { System.out.println("dans GRILLE.mouseClicked, je viens de cliquer sur g1"); // si je clique sur "b_gauche" en "conception : if (Var.simul_en_cours == false && e.getButton() == MouseEvent.BUTTON1) { Click_Gauche_Conception.clic_g1_conception(this.getMousePosition()); } // si je clique sur "b_gauche" en "simulation : if (Var.simul_en_cours == true && e.getButton() == MouseEvent.BUTTON1) { Click_Simulation.clic_g1_simulation(this.getMousePosition()); } // si je clique sur "b_droit" en "conception : if (Var.simul_en_cours == false && e.getButton() == MouseEvent.BUTTON3) { Click_Droit_Conception.clic_droit_conception(this.getMousePosition()); } } // === fin de je clique sur g1 ============= @Override public void mousePressed(MouseEvent e) { // ATTENTION, l'évenement est la position de la souris par rapport à la grille une seule fois au "press"!! cible = Var.g1.findComponentAt(e.getPoint()); System.out.println(" Dans GRILLE.mousePressed, le composant détecté est : " + cible); dx0 = e.getX() - cible.getX(); // écart sur x au "press" sur objet dy0 = e.getY() - cible.getY(); } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } // --- je dragged sur g1 ---------------- @Override public void mouseDragged(MouseEvent e) { Controle_Dragged.je_traine_un_objet( cible, e, dx0, dy0); } //=========== fin de méthode dragged sur segment ---- @Override public void mouseMoved(MouseEvent e) { }
Quand de je créé un conducteur, en bleu, je peux le détecter, le déplacer et le redimensionner en "trainant" les lignes élémentaires qui le composent. Ça fonctionne plutôt bien!
Cependant, à présent, pour plus de confort d'utilisation, j'aimerais qu'au survol d'un fil, ce dernier change de couleur, afin de pouvoir le "cliquer" facilement.
Le problème, c'est que le "MouseEnter" ou le "MouseExit" détecte dans ce cas, l'entrée ou la sortie de la grille, qui est le grand conteneur gris. C'est normal, puisque ce dernier porte le "listener" mais c'est sans intérêt pour moi.
J'ai donc tenter d'ajouter un "listener" sur mes fils, et en effet, la détection se fait, mais dans ce cas, le "dragged" porté par la grille ne fonctionne plus...
Question1: Le fait d'ajouter un "listener" sur plusieurs objets qui sont sur des niveaux différents, semble donner l'exclusivité au "listener" le plus haut à l'affichage. Est-ce le cas?
Question2: Je souhaite garder la gestion des déplacements de composants, géré au niveau de la grille principale. Détecter une entrée/sortie sur un composant de type "fil" est-il possible dans ce contexte?
(j'ai tenté de gérer directement par un "listener" sur le fil, à la fois les entrées/sorties et les déplacements/redimensionnements, mais les mouvements ne sont plus aussi fluides que gérés au niveau de la grille support.)
Question3 : Existe-t-il une autre solution ??
Merci à tous ceux qui ont des idées pour résoudre ce souci!...
Partager