Bonjour à tous,
j'ai réalisé un popupmenu que je souhaite optimiser.
Le menu affiche 3 choix :
- "couleur_fils"
- "couleur_num_fils"
- "effecer_fils.
J'utilise pour chaque Jitem, une surveillance d'action (click) par un "addActionEvevent".
Cela fonctionne bien.
Sur le menu "couleur_fils", au "click", j'ouvre un sous-menu, proposant un choix de 9 couleurs.
1/ N'y a t-il pas une méthode plus efficace que celle d'un surveillance indépendante de chaque item, avec son "ActionEvent" dédiée??
Quand le nombre d'items est important, cela devient lourd et laborieux, et le code pratiquement identique est répété n fois.
2/ J'ai tenté plusieurs approches, notamment celle en commentaires, avec une surveillance par "MouseListener" au niveau de l'objet sous menu complet, espérant pouvoir identifier le choix de l'item de la couleur souhaitée, en détectant le "name" du composant où à lieu le clic. (C'est pour cela que les deux premières couleurs ont un "name")
Cela ne fonctionne pas car l'écouteur ne semble pas faire des "tranches" par item (noire, marron etc...) mais voir alors uniquement l'objet complet qui affiche toutes ces couleurs....
Dois-je réellement créer un listener par item???
3/ comment gère-t-on cela quand des menu proposent des dizaines de choix?? J'ai du mal à croire que chaque item ait son propre écouteur???...
Voila le code temporaire :
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179 public class MousePopupMenu extends JPopupMenu{ protected JPopupMenu sm; /* * ICI ON DEFINT LE CONSTRUCTEUR D'UN MENU CONTEXTUEL */ public MousePopupMenu() { super(); // 1.1 On créé et ajoute un item "Couleurs_Fils" dans le menu JMenuItem couleur_fils = new JMenuItem( "couleur_fils" ); couleur_fils.setIcon( new ImageIcon( "icones/visage.png" ) ); couleur_fils.setMnemonic( 'C' ); couleur_fils.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK) ); // on ajoute un listener couleur_fils.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("on veut changer la couleur des fils"); couleur_fils.add( sm = sous_menu()); sm.show(Var.g1, Var.g1.getMousePosition().x , Var.g1.getMousePosition().y); } }); // on ajoute l'item 1 au menu. this.add(couleur_fils); //------------------------------------------------------------------------------- //On ajoute une barre de Séparation dans le menu this.addSeparator(); //---------------------------------------------------------------------------------- // 1.2 On créé et ajoute un item ""couleur_num_fils" JMenuItem couleur_num_fils = new JMenuItem( "couleur_num_fils" ); couleur_num_fils.setIcon( new ImageIcon( "icones/open.png" ) ); couleur_num_fils.setMnemonic( 'N' ); couleur_num_fils.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK) ); // on ajoute un listener couleur_num_fils.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("on veut changer les numéros des fils"); } }); // ajout du item_2 au menu. this.add(couleur_num_fils); //-------------------------------------------------------------------------------- //On ajoute une barre de Séparation dans le menu this.addSeparator(); //---------------------------------------------------------------------------------- // 1.3 On créé et ajoute un item "effacer_fils" JMenuItem effacer_fils = new JMenuItem( "effacer_fils" ); effacer_fils.setIcon( new ImageIcon( "icones/save.png" ) ); effacer_fils.setMnemonic( 'E' ); effacer_fils.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_DOWN_MASK) ); //on ajoute un listener effacer_fils.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("on veut effacer tous les fils"); Click_MenuDroit.effacer_tous_les_fils(); } }); // ajout du item_3 au menu. this.add(effacer_fils); //------------------------------------------------------------------------------------- } // fin du menu // ------------- fonction sous_menu couleur de fil ------------------------------- public static JPopupMenu sous_menu() { JPopupMenu couleur = new JPopupMenu(); JMenuItem noire = new JMenuItem ("noire"); noire.setName("no"); JMenuItem marron = new JMenuItem ("marron"); marron.setName("ma"); JMenuItem rouge = new JMenuItem ("rouge"); JMenuItem orange = new JMenuItem ("orange"); JMenuItem jaune = new JMenuItem ("jaune"); JMenuItem vert = new JMenuItem ("vert"); JMenuItem bleu = new JMenuItem ("bleu"); JMenuItem gris = new JMenuItem ("gris"); JMenuItem blanc = new JMenuItem ("blanc"); couleur.add(noire); couleur.addSeparator(); couleur.add(marron); couleur.addSeparator(); couleur.add (rouge); couleur.addSeparator(); couleur.add (orange); couleur.addSeparator(); couleur.add(jaune); couleur.addSeparator(); couleur.add(vert); couleur.addSeparator(); couleur.add(bleu); couleur.addSeparator(); couleur.add (gris); couleur.addSeparator(); couleur.add (blanc); noire.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("on sélectionne la couleur NOIRE."); } }); // couleur.addMouseListener( new MouseListener() { // // @Override // public void mouseClicked(MouseEvent e) { // System.out.println("j'ai cliqué"); // // } // // @Override // public void mousePressed(MouseEvent e) { // System.out.println("j'ai cliqué"); // // } // // @Override // public void mouseReleased(MouseEvent e) { // // // } // // @Override // public void mouseEntered(MouseEvent e) { // System.out.println("composant : " + e.getComponent().getName()); // // } // // @Override // public void mouseExited(MouseEvent e) { // // // } // }); return couleur; } // =========== fin de fonction ==================== } //===================== fin de CLASSE ======================
Merci à tous pour vos lectures et vos idées à venir...
Partager