je ne comprend pas bien,veuillez m'expliquez svpCitation:
Donc la correction que tu as faite dans morph, il faut aussi la faire sans le morph
Version imprimable
je ne comprend pas bien,veuillez m'expliquez svpCitation:
Donc la correction que tu as faite dans morph, il faut aussi la faire sans le morph
Au départ tu avais deux méthodes, avec des if pour identifié le carré, erronées. T'en a corrigé une, mais tu n'a pas corrigé l'autre, tout simplement. Donc à problème identique => solution identique.
ok,je l'ai corrigé,ça marche,
merci beaucoup
on continue dans la même programme:
après avoir modifié mon prg
mon couleur de fond et couleur de la forme ne change pas,(clique droite)
indiquez moi où est ce que j'ai pu faire erreur,mais il indique aucune erreur;
Code:
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201 import java.awt.Color; import java.awt.font.*; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JPanel; public class Panneau extends JPanel { private int posX=-50; private int posY=-50; private int drawSize=50; //boolean pour le mode morphing et pour savoir si la taille doit être réduite private boolean morph=false,reduce=false; private String forme="ROND"; /* voici nos deux couleurs */ private Color couleurForme=Color.red; private Color couleurFond=Color.white; //le compteur de rafraîchissement private int increment=0; public void paintComponent (Graphics g) { //affectation de la couleur de fond g.setColor (couleurFond); g.fillRect (0,0,this.getWidth ( ),this.getHeight ( )); //affectation de la couleur de la forme g.setColor(couleurForme); //si le mode morphing est activé, on peint le morphing //g.setColor (Color.red); if(this.morph) drawMorph(g); else draw(g); } /* méthode qui redéfinit la couleur du fond */ public void setCouleurFond(Color color) { this.couleurFond=color; } /* methode qui redéfinit la couleur du forme*/ public void setCouleurForme(Color color) { this.couleurForme=color; } private void draw(Graphics g) { if(this.forme.equals("ROND")) { g.fillOval(posX,posY,50,50); } if(this.forme.equals("CARRE")||this.forme.equals("CARRÉ")) { g.fillRect(posX,posY,50,50); } if(this.forme.equals("TRIANGLE")) { int s1X=posX+50/2; int s1Y=posY; int s2X=posX+50; int s2Y=posY+50; int s3X=posX; int s3Y=posY+50; int[]ptsX={s1X,s2X,s3X}; int[]ptsY={s1Y,s2Y,s3Y}; g.fillPolygon(ptsX,ptsY,3); } if(this.forme.equals("ETOILE")) { int s1X=posX+50/2; int s1Y=posY; int s2X=posX+50; int s2Y=posY+50; g.drawLine(s1X,s1Y,s2X,s2Y); int s3X=posX; int s3Y=posY+50/3; g.drawLine(s2X,s2Y,s3X,s3Y); int s4X=posX+50; int s4Y=posY+50/3; g.drawLine(s3X,s3Y,s4X,s4Y); int s5X=posX; int s5Y=posY+50; g.drawLine(s4X,s4Y,s5X,s5Y); g.drawLine(s5X,s5Y,s1X,s1Y); } } /* méthode qui peint le morphing */ private void drawMorph(Graphics g) { //on incrémente le tour increment++; //on regarde si on doit réduire ou non if(drawSize>=50)reduce=true; if(drawSize<=10)reduce=false; if(reduce) drawSize=drawSize-getUsedSize(); else drawSize=drawSize+getUsedSize(); if(this.forme.equals("ROND")) { g.fillOval(posX, posY, drawSize, drawSize); } if(this.forme.equals("CARRE")||this.forme.equals("CARRÉ")) { g.fillRect(posX, posY, drawSize,drawSize); } if(this.forme.equals("TRIANGLE")) { int s1X=posX+drawSize/2; int s1Y=posY; int s2X=posX+drawSize; int s2Y=posY+drawSize; int s3X=posX; int s3Y=posY+drawSize; int[]ptsX={s1X,s2X,s3X}; int[]ptsY={s1Y,s2Y,s3Y}; g.fillPolygon(ptsX,ptsY,3); } if(this.forme.equals("ETOILE")) { int s1X=posX+drawSize/2; int s1Y=posY; int s2X=posX+drawSize; int s2Y=posY+drawSize; g.drawLine(s1X,s1Y,s2X,s2Y); int s3X=posX; int s3Y=posY+drawSize/3; g.drawLine(s2X,s2Y,s3X,s3Y); int s4X=posX+drawSize; int s4Y=posY+drawSize/3; g.drawLine(s3X,s3Y,s4X,s4Y); int s5X=posX; int s5Y=posY+drawSize; g.drawLine(s4X,s4Y,s5X,s5Y); g.drawLine(s5X,s5Y,s1X,s1Y); } } /* méthode qui retourne le nombre à retrancher ou ajouter pour le morphing */ private int getUsedSize() { int res=0; //si le nombre de tours est 10 //on réinitialise l'incrément et on retourne 1 if(increment/10==1) { increment=0; res=1; } return res; } public int getDrawSize() { return drawSize; } public boolean isMorph() { return morph; } public void setMorph(boolean bool) { this.morph=bool; //on réinitialise la taille drawSize=50; } public void setForme(String form) { this.forme=form.toUpperCase(); } public int getPosX( ) { return posX; } public void setPosX (int posX) { this.posX=posX; } public int getPosY ( ) { return posY; } public void setPosY (int posY) { this.posY=posY; } }
Code:
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383 import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.KeyStroke; public class FenetreTest extends JFrame { private Panneau pan = new Panneau(); private JPanel container = new JPanel(); private int compteur = 0; private boolean animated = true; private boolean backX, backY; private int x,y ; private Thread t; /* La déclaration pour le menu de la JMenuBar */ private JMenuBar menuBar = new JMenuBar(); private JMenu animation = new JMenu("Animation"),forme = new JMenu("Forme"), typeForme = new JMenu("Type de forme"),aPropos = new JMenu("À propos"); private JMenuItem lancer = new JMenuItem("Lancer l'animation"), arreter = new JMenuItem("Arrêter l'animation"), quitter = new JMenuItem("Quitter"),aProposItem = new JMenuItem("?"); private JCheckBoxMenuItem morph = new JCheckBoxMenuItem("Morphing"); private JRadioButtonMenuItem carre = new JRadioButtonMenuItem("Carré"), rond = new JRadioButtonMenuItem("Rond"), triangle = new JRadioButtonMenuItem("Triangle"), etoile = new JRadioButtonMenuItem("Etoile"); private ButtonGroup bg = new ButtonGroup(); /* La déclaration pour le menu contextuel */ private JPopupMenu jpm=new JPopupMenu(); private JMenu background=new JMenu("Couleur de fond"); private JMenu couleur=new JMenu("Couleur de la forme"); private JMenuItem launch=new JMenuItem("Lancer l'animation"); private JMenuItem stop=new JMenuItem("Arrêter l'animation"); private JMenuItem rouge=new JMenuItem("Rouge"),bleu=new JMenuItem("Bleu"), vert=new JMenuItem("Vert"),blanc=new JMenuItem("Blanc"), rougeBack=new JMenuItem("Rouge"), bleuBack=new JMenuItem("Bleu"),vertBack=new JMenuItem("Vert"), blancBack=new JMenuItem("Blanc"); /*On crée des listener globaux */ private StopAnimationListener stopAnimation=new StopAnimationListener(); private StartAnimationListener startAnimation=new StartAnimationListener(); private CouleurFondListener bgColor=new CouleurFondListener(); private CouleurFormeListener frmColor=new CouleurFormeListener(); public FenetreTest() { this.setTitle("Animation"); this.setSize(300, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); container.setBackground(Color.white); container.setLayout(new BorderLayout()); //on initialise le menu stop stop.setEnabled(false); //on affecte les écouteurs stop.addActionListener(stopAnimation); launch.addActionListener(startAnimation); //on affecte les écouteurs aux points de menu rouge.addActionListener(frmColor); bleu.addActionListener(frmColor); vert.addActionListener(frmColor); blanc.addActionListener(frmColor); rougeBack.addActionListener(bgColor); bleuBack.addActionListener(bgColor); vertBack.addActionListener(bgColor); blancBack.addActionListener(bgColor); //on crée et on passe l'écouteur pour afficher le menu contextuel //création d'une implémentation de MouseAdapter avec redéfinition de la méthode adéquate pan.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent event) { //seulement s'il s'agit d'un clic droit //vous pouvez aussi utiliser cette méthode pour détecter le clic droit if(event.isPopupTrigger()) { background.add(blancBack); background.add(rougeBack); background.add(bleuBack); background.add(vertBack); couleur.add(blanc); couleur.add(rouge); couleur.add(bleu); couleur.add(vert); jpm.add(launch); jpm.add(stop); jpm.add(couleur); jpm.add(background); //la méthode qui va afficher le menu jpm.show(pan, event.getX(),event.getY()); } } }); container.add(pan, BorderLayout.CENTER); this.setContentPane(container); this.initMenu(); this.setVisible(true); } private void initMenu() { //Menu animation //******************/ //ajout du listener pour lancer l'animation //ATTENTION LE LISTENER EST GLOBAL !!!! //-------------------------------------------------------- lancer.addActionListener(startAnimation); lancer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,KeyEvent.CTRL_MASK)); animation.add(lancer); //ajout du listener pour arrêter l'animation //LISTENER A CHANGER ICI AUSSI //--------------------------------------------- arreter.addActionListener(stopAnimation); arreter.setEnabled(false); arreter.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_A,KeyEvent.CTRL_DOWN_MASK+KeyEvent.SHIFT_DOWN_MASK)); animation.add(arreter); animation.addSeparator(); //Pour quitter l'application quitter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); animation.add(quitter); //Menu forme bg.add(carre); bg.add(triangle); bg.add(rond); bg.add(etoile); //on crée un nouvel écouter, inutile de créer 4 instances différentes FormeListener f1=new FormeListener(); carre.addActionListener(f1); rond.addActionListener(f1); triangle.addActionListener(f1); etoile.addActionListener(f1); typeForme.add(rond); typeForme.add(carre); typeForme.add(triangle); typeForme.add(etoile); rond.setSelected(true); forme.add(typeForme); //Ajout du listener pour le morphing morph.addActionListener(new MorphListener()); forme.add(morph); //menu à propos //Ajout de ce que doit faire le "?" aProposItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { JOptionPane jop=new JOptionPane(); ImageIcon img=new ImageIcon("images/png.png"); String mess="Merci!\n J'espère que vous vous amusez bien!\n"; mess+="Je crois qu'il est temps d'ajouter des accélérateurs et des mnémoniques dans tout ça...\n"; mess+="\n Allez, GO les Zéros!"; jop.showMessageDialog(null,mess,"A propos",JOptionPane.INFORMATION_MESSAGE,img); } }); aPropos.add(aProposItem); //Ajout des menus dans la barre de menus et ajout de mnemonics! animation.setMnemonic('A'); menuBar.add(animation); forme.setMnemonic('F'); menuBar.add(forme); aPropos.setMnemonic('P'); menuBar.add(aPropos); //Ajout de la barre de menus sur la fenêtre this.setJMenuBar(menuBar); } private void go() { x = pan.getPosX(); y = pan.getPosY(); while(this.animated) { //Si le mode morphing est activé, on utilise la taille actuelle de la forme if(pan.isMorph()) { if(x < 1)backX = false; if(x > pan.getWidth() - pan.getDrawSize())backX = true; if(y < 1)backY = false; if(y > pan.getHeight() - pan.getDrawSize())backY = true; } //Sinon, comme d'habitude else { if(x < 1)backX = false; if(x > pan.getWidth()-50)backX = true; if(y < 1)backY = false; if(y > pan.getHeight()-50)backY = true; } if(!backX)pan.setPosX(++x); else pan.setPosX(--x); if(!backY) pan.setPosY(++y); else pan.setPosY(--y); pan.repaint(); try { Thread.sleep(3); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /*Ecouteur du menu Lancer */ public class StartAnimationListener implements ActionListener { public void actionPerformed(ActionEvent arg0) { JOptionPane jop = new JOptionPane(); int option = jop.showConfirmDialog(null, "Voulez-vous lancer l'animation ?", "Lancement de l'animation",JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE); if(option == JOptionPane.OK_OPTION) { lancer.setEnabled(false); arreter.setEnabled(true); //ON AJOUTE L'INSTRUCTION POUR LE MENU CONTEXTUEL //************************************************ launch.setEnabled(false); stop.setEnabled(true); animated = true; t = new Thread(new PlayAnimation()); t.start(); } } } /* Écouteur du menu Quitter */ class StopAnimationListener implements ActionListener { public void actionPerformed(ActionEvent e) { JOptionPane jop = new JOptionPane(); int option = jop.showConfirmDialog(null, "Voulez-vous arrêter l'animation ?", "Arrêt de l'animation", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if(option != JOptionPane.NO_OPTION && option != JOptionPane.CANCEL_OPTION && option != JOptionPane.CLOSED_OPTION) { animated = false; //On remplace nos boutons par nos JMenuItem lancer.setEnabled(true); arreter.setEnabled(false); //ON AJOUTE L'INSTRUCTION POUR LE MENU CONTEXTUEL //************************************************ launch.setEnabled(true); stop.setEnabled(false); } } } /* Lance le thread.*/ class PlayAnimation implements Runnable { public void run() { go(); } } /* Écoute les menus forme */ class FormeListener implements ActionListener { public void actionPerformed(ActionEvent e) { pan.setForme(((JRadioButtonMenuItem)e.getSource()).getText()); } } /* Écoute le menu Morphing */ class MorphListener implements ActionListener { public void actionPerformed(ActionEvent e) { //Si la case est cochée, activation du mode morphing if(morph.isSelected())pan.setMorph(true); //Sinon rien ! else pan.setMorph(false); } } //class qui vont écouter le changement de couleurs /* ecoute le changement de couleur du fond */ class CouleurFondListener implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==vertBack) pan.setCouleurFond(Color.green); else if(e.getSource()==bleuBack) pan.setCouleurFond(Color.blue); else if(e.getSource()==rougeBack) pan.setCouleurFond(Color.red); else pan.setCouleurFond(Color.white); } } /* ecoute le changement de couleur du fond*/ class CouleurFormeListener implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==vert) pan.setCouleurForme(Color.green); else if(e.getSource()==bleu) pan.setCouleurForme(Color.blue); else if(e.getSource()==rouge) pan.setCouleurForme(Color.red); else pan.setCouleurForme(Color.white); } } public static void main(String[]main) { Fenetre fen=new Fenetre(); } }
Salut,
Les méthodes qui te servent à changer les couleurs sont les suivantes :
Ces méthodes ne font que modifier des variables. Rien ne permet à SWING de savoir que les couleurs ont été changées (de savoir qu'un changement de valeur d'une de ces variables impliquent un changement de couleur dans un truc qui est affiché) et donc qu'il faut répercuter ces changements sur l'affichage. Tu dois explicitement le faire, en simplement appelant repaint(), lorsque tu changes la couleur, comme ça :Code:
1
2
3
4
5
6
7
8
9
10 /* méthode qui redéfinit la couleur du fond */ public void setCouleurFond(Color color) { this.couleurFond=color; } /* methode qui redéfinit la couleur du forme*/ public void setCouleurForme(Color color) { this.couleurForme=color; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12 /* méthode qui redéfinit la couleur du fond */ public void setCouleurFond(Color color) { this.couleurFond=color; repaint(); } /* methode qui redéfinit la couleur du forme*/ public void setCouleurForme(Color color) { this.couleurForme=color; repaint(); }
j'ai modifié le prg comme vs m'avez indiqué;
mais, rien ne changé
Code:
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203 import java.awt.Color; import java.awt.font.*; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JPanel; public class Panneau extends JPanel { private int posX=-50; private int posY=-50; private int drawSize=50; //boolean pour le mode morphing et pour savoir si la taille doit être réduite private boolean morph=false,reduce=false; private String forme="ROND"; /* voici nos deux couleurs */ private Color couleurForme=Color.red; private Color couleurFond=Color.white; //le compteur de rafraîchissement private int increment=0; public void paintComponent (Graphics g) { //affectation de la couleur de fond g.setColor (couleurFond); g.fillRect (0,0,this.getWidth ( ),this.getHeight ( )); //affectation de la couleur de la forme g.setColor(couleurForme); //si le mode morphing est activé, on peint le morphing //g.setColor (Color.red); if(this.morph) drawMorph(g); else draw(g); } /* méthode qui redéfinit la couleur du fond */ public void setCouleurFond(Color color) { this.couleurFond=color; repaint(); } /* methode qui redéfinit la couleur du forme*/ public void setCouleurForme(Color color) { this.couleurForme=color; repaint(); } private void draw(Graphics g) { if(this.forme.equals("ROND")) { g.fillOval(posX,posY,50,50); } if(this.forme.equals("CARRE")||this.forme.equals("CARRÉ")) { g.fillRect(posX,posY,50,50); } if(this.forme.equals("TRIANGLE")) { int s1X=posX+50/2; int s1Y=posY; int s2X=posX+50; int s2Y=posY+50; int s3X=posX; int s3Y=posY+50; int[]ptsX={s1X,s2X,s3X}; int[]ptsY={s1Y,s2Y,s3Y}; g.fillPolygon(ptsX,ptsY,3); } if(this.forme.equals("ETOILE")) { int s1X=posX+50/2; int s1Y=posY; int s2X=posX+50; int s2Y=posY+50; g.drawLine(s1X,s1Y,s2X,s2Y); int s3X=posX; int s3Y=posY+50/3; g.drawLine(s2X,s2Y,s3X,s3Y); int s4X=posX+50; int s4Y=posY+50/3; g.drawLine(s3X,s3Y,s4X,s4Y); int s5X=posX; int s5Y=posY+50; g.drawLine(s4X,s4Y,s5X,s5Y); g.drawLine(s5X,s5Y,s1X,s1Y); } } /* méthode qui peint le morphing */ private void drawMorph(Graphics g) { //on incrémente le tour increment++; //on regarde si on doit réduire ou non if(drawSize>=50)reduce=true; if(drawSize<=10)reduce=false; if(reduce) drawSize=drawSize-getUsedSize(); else drawSize=drawSize+getUsedSize(); if(this.forme.equals("ROND")) { g.fillOval(posX, posY, drawSize, drawSize); } if(this.forme.equals("CARRE")||this.forme.equals("CARRÉ")) { g.fillRect(posX, posY, drawSize,drawSize); } if(this.forme.equals("TRIANGLE")) { int s1X=posX+drawSize/2; int s1Y=posY; int s2X=posX+drawSize; int s2Y=posY+drawSize; int s3X=posX; int s3Y=posY+drawSize; int[]ptsX={s1X,s2X,s3X}; int[]ptsY={s1Y,s2Y,s3Y}; g.fillPolygon(ptsX,ptsY,3); } if(this.forme.equals("ETOILE")) { int s1X=posX+drawSize/2; int s1Y=posY; int s2X=posX+drawSize; int s2Y=posY+drawSize; g.drawLine(s1X,s1Y,s2X,s2Y); int s3X=posX; int s3Y=posY+drawSize/3; g.drawLine(s2X,s2Y,s3X,s3Y); int s4X=posX+drawSize; int s4Y=posY+drawSize/3; g.drawLine(s3X,s3Y,s4X,s4Y); int s5X=posX; int s5Y=posY+drawSize; g.drawLine(s4X,s4Y,s5X,s5Y); g.drawLine(s5X,s5Y,s1X,s1Y); } } /* méthode qui retourne le nombre à retrancher ou ajouter pour le morphing */ private int getUsedSize() { int res=0; //si le nombre de tours est 10 //on réinitialise l'incrément et on retourne 1 if(increment/10==1) { increment=0; res=1; } return res; } public int getDrawSize() { return drawSize; } public boolean isMorph() { return morph; } public void setMorph(boolean bool) { this.morph=bool; //on réinitialise la taille drawSize=50; } public void setForme(String form) { this.forme=form.toUpperCase(); } public int getPosX( ) { return posX; } public void setPosX (int posX) { this.posX=posX; } public int getPosY ( ) { return posY; } public void setPosY (int posY) { this.posY=posY; } }
Salut,
Je viens de tester plusieurs fois ton code et ça fonctionne très bien (à part saut de ligne au milieu d'une String, et le nom de la classe dans la méthode main() qui était erronée, dans FenetreTest.
Bon, on ne voit pas d'effet de changement de couleur de forme tant qu'on a pas lancée l l’animation, mais c'est normal, vu qu'il n'y a aucune forme affichée !
dites moi svp, où est manqué accolade,et nom de classe erronéCitation:
à part une accolade qui manquait, et le nom de la classe dans la méthode main() qui était erronée.
dans mon cas, quand je fait clique droite, et en sélectionnant la couleur de forme ou couleur de fond, ne change rien,à part le carré,rond,étoile marche bien
Non, désolé, c'était pas une accolade qui manquait, il y'a avait 2 erreurs de compile, et quand je les ai corrigées j'ai du supprimer une accolade par inadvertance.
Donc, il y avait un saut de ligne dans une constante String :
et, dans le main() :Code:
1
2 mess+="Je crois qu'il est temps d'ajouter des accélérateurs et des mnémoniques dans tout ça...\n";
Ce n'est pas Fenetre, mais FenetreTestCode:
1
2
3
4 public static void main(String[]main) { Fenetre fen=new Fenetre(); }
J'ai recréé un projet à zéro, réimporter tes sources, modifier le nom de classe Fenetre, en FenetreTest, supprimer le CR dans la String (cf post précédent), ajouter les 2 appels de repaint() et je n'ai aucun souci.
vous avez raison,j'ai corrigé mon erreur,
maintenant je vais continuer écrire le prg
je vais écrire," pour les barres d' outils"
merci beaucoup
voilà je reviens avec mes soucis;
j'ai modifié mon prg FenetreTest pour continuer dans la barre d'outils,
après avoir exécuté mon prg, seulement le rond et arrêt marche,
quand je clique sur l'autre forme mon prg s'arrête,il n'y a aucune erreur lors de compilation et exécution,aidez moi svp.
et il faut prendre en compte aussi la class PanneauCode:
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.JToolBar; import javax.swing.KeyStroke; public class FenetreTest extends JFrame { private Panneau pan = new Panneau(); private JPanel container = new JPanel(); private int compteur = 0; private boolean animated = true; private boolean backX, backY; private int x,y ; private Thread t; /* La déclaration pour le menu de la JMenuBar */ private JMenuBar menuBar = new JMenuBar(); private JMenu animation = new JMenu("Animation"),forme = new JMenu("Forme"),typeForme = new JMenu("Type de forme"),aPropos = new JMenu("À propos"); private JMenuItem lancer = new JMenuItem("Lancer l'animation"), arreter = new JMenuItem("Arrêter l'animation"), quitter = new JMenuItem("Quitter"),aProposItem = new JMenuItem("?"); private JCheckBoxMenuItem morph = new JCheckBoxMenuItem("Morphing"); private JRadioButtonMenuItem carre = new JRadioButtonMenuItem("Carré"), rond = new JRadioButtonMenuItem("Rond"), triangle = new JRadioButtonMenuItem("Triangle"),etoile = new JRadioButtonMenuItem("Etoile"); private ButtonGroup bg = new ButtonGroup(); /* La déclaration pour le menu contextuel */ private JPopupMenu jpm=new JPopupMenu(); private JMenu background=new JMenu("Couleur de fond"); private JMenu couleur=new JMenu("Couleur de la forme"); private JMenuItem launch=new JMenuItem("Lancer l'animation"); private JMenuItem stop=new JMenuItem("Arrêter l'animation"); private JMenuItem rouge=new JMenuItem("Rouge"),bleu=new JMenuItem("Bleu"),vert=new JMenuItem("Vert"),blanc=new JMenuItem("Blanc"), rougeBack=new JMenuItem("Rouge"),bleuBack=new JMenuItem("Bleu"),vertBack=new JMenuItem("Vert"),blancBack=new JMenuItem("Blanc"); /*On crée des listener globaux */ private StopAnimationListener stopAnimation=new StopAnimationListener(); private StartAnimationListener startAnimation=new StartAnimationListener(); private CouleurFondListener bgColor=new CouleurFondListener(); private CouleurFormeListener frmColor=new CouleurFormeListener(); //Création de notre barre d'outils private JToolBar toolBar=new JToolBar(); //les Boutons /* private JButton play=new JButton (new ImageIcon("images/play.jpg")); private JButton cancel=new JButton(new ImageIcon("images/stop.jpg")); private JButton square=new JButton(new ImageIcon("images/carré.jpg")); private JButton tri=new JButton(new ImageIcon("images/triangle.jpg")); private JButton circle=new JButton(new ImageIcon("images/rond.jpg")); private JButton star=new JButton(new ImageIcon("images/star.jpg"));*/ private JButton play=new JButton (new ImageIcon("images/play.jpg")),cancel=new JButton(new ImageIcon("images/stop.jpg")), square=new JButton(new ImageIcon("images/carré.jpg")),tri=new JButton(new ImageIcon("images/triangle.jpg")), circle=new JButton(new ImageIcon("images/rond.jpg")),star=new JButton(new ImageIcon("images/star.jpg")); private Color fondBouton=Color.white; private FormeListener fListener=new FormeListener(); public FenetreTest() { this.setTitle("Animation"); this.setSize(300, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); container.setBackground(Color.white); container.setLayout(new BorderLayout()); //on initialise le menu stop stop.setEnabled(false); //on affecte les écouteurs stop.addActionListener(stopAnimation); launch.addActionListener(startAnimation); //on affecte les écouteurs aux points de menu rouge.addActionListener(frmColor); bleu.addActionListener(frmColor); vert.addActionListener(frmColor); blanc.addActionListener(frmColor); rougeBack.addActionListener(bgColor); bleuBack.addActionListener(bgColor); vertBack.addActionListener(bgColor); blancBack.addActionListener(bgColor); //on crée et on passe l'écouteur pour afficher le menu contextuel //création d'une implémentation de MouseAdapter avec redéfinition de la méthode adéquate pan.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent event) { //seulement s'il s'agit d'un clic droit //vous pouvez aussi utiliser cette méthode pour détecter le clic droit if(event.isPopupTrigger()) { background.add(blancBack); background.add(rougeBack); background.add(bleuBack); background.add(vertBack); couleur.add(blanc); couleur.add(rouge); couleur.add(bleu); couleur.add(vert); jpm.add(launch); jpm.add(stop); jpm.add(couleur); jpm.add(background); //la méthode qui va afficher le menu jpm.show(pan, event.getX(),event.getY()); } } }); container.add(pan, BorderLayout.CENTER); this.setContentPane(container); this.initMenu(); this.initToolBar(); this.setVisible(true); } private void initToolBar() { this.cancel.setEnabled(false); this.cancel.addActionListener(stopAnimation); this.cancel.setBackground(fondBouton); this.play.addActionListener(startAnimation); this.play.setBackground(fondBouton); this.toolBar.add(play); this.toolBar.add(cancel); this.toolBar.addSeparator(); //ajout des listeners this.circle.addActionListener(fListener); this.circle.setBackground(fondBouton); this.toolBar.add(circle); this.square.addActionListener(fListener); this.square.setBackground(fondBouton); this.toolBar.add(square); this.tri.setBackground(fondBouton); this.tri.addActionListener(fListener); this.toolBar.add(tri); this.star.setBackground(fondBouton); this.star.addActionListener(fListener); this.toolBar.add(star); this.add(toolBar, BorderLayout.NORTH); } private void initMenu() { //Menu animation //******************/ //ajout du listener pour lancer l'animation //ATTENTION LE LISTENER EST GLOBAL !!!! //-------------------------------------------------------- lancer.addActionListener(startAnimation); lancer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,KeyEvent.CTRL_MASK)); animation.add(lancer); //ajout du listener pour arrêter l'animation //LISTENER A CHANGER ICI AUSSI //--------------------------------------------- arreter.addActionListener(stopAnimation); arreter.setEnabled(false); arreter.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_A,KeyEvent.CTRL_DOWN_MASK+KeyEvent.SHIFT_DOWN_MASK)); animation.add(arreter); animation.addSeparator(); //Pour quitter l'application quitter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); animation.add(quitter); //Menu forme bg.add(carre); bg.add(triangle); bg.add(rond); bg.add(etoile); //on crée un nouvel écouter, inutile de créer 4 instances différentes //FormeListener f1=new FormeListener(); carre.addActionListener(fListener); rond.addActionListener(fListener); triangle.addActionListener(fListener); etoile.addActionListener(fListener); typeForme.add(rond); typeForme.add(carre); typeForme.add(triangle); typeForme.add(etoile); rond.setSelected(true); forme.add(typeForme); //Ajout du listener pour le morphing morph.addActionListener(new MorphListener()); forme.add(morph); //menu à propos //Ajout de ce que doit faire le "?" aProposItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { JOptionPane jop=new JOptionPane(); ImageIcon img=new ImageIcon("images/png.png"); String mess="Merci!\n J'espère que vous vous amusez bien!\n"; mess+="Je crois qu'il est temps d'ajouter des accélérateurs et des mnémoniques dans tout ça...\n"; mess+="\n Allez, GO les Zéros!"; jop.showMessageDialog(null,mess,"A propos",JOptionPane.INFORMATION_MESSAGE,img); } }); aPropos.add(aProposItem); //Ajout des menus dans la barre de menus et ajout de mnemonics! animation.setMnemonic('A'); menuBar.add(animation); forme.setMnemonic('F'); menuBar.add(forme); aPropos.setMnemonic('P'); menuBar.add(aPropos); //Ajout de la barre de menus sur la fenêtre this.setJMenuBar(menuBar); } private void go() { x = pan.getPosX(); y = pan.getPosY(); while(this.animated) { //Si le mode morphing est activé, on utilise la taille actuelle de la forme if(pan.isMorph()) { if(x < 1)backX = false; if(x > pan.getWidth() - pan.getDrawSize())backX = true; if(y < 1)backY = false; if(y > pan.getHeight() - pan.getDrawSize())backY = true; } //Sinon, comme d'habitude else { if(x < 1)backX = false; if(x > pan.getWidth()-50)backX = true; if(y < 1)backY = false; if(y > pan.getHeight()-50)backY = true; } if(!backX)pan.setPosX(++x); else pan.setPosX(--x); if(!backY) pan.setPosY(++y); else pan.setPosY(--y); pan.repaint(); try { Thread.sleep(3); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /*Ecouteur du menu Lancer */ public class StartAnimationListener implements ActionListener { public void actionPerformed(ActionEvent arg0) { JOptionPane jop = new JOptionPane(); int option = jop.showConfirmDialog(null,"Voulez-vous lancer l'animation ?", "Lancement de l'animation",JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE); if(option == JOptionPane.OK_OPTION) { lancer.setEnabled(false); arreter.setEnabled(true); //ON AJOUTE L'INSTRUCTION POUR LE MENU CONTEXTUEL //************************************************ launch.setEnabled(false); stop.setEnabled(true); play.setEnabled(false); cancel.setEnabled(true); animated = true; t = new Thread(new PlayAnimation()); t.start(); } } } /* Écouteur du menu Quitter */ class StopAnimationListener implements ActionListener { public void actionPerformed(ActionEvent e) { JOptionPane jop = new JOptionPane(); int option = jop.showConfirmDialog(null, "Voulez-vous arrêter l'animation ?","Arrêt de l'animation",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE); if(option != JOptionPane.NO_OPTION && option != JOptionPane.CANCEL_OPTION && option != JOptionPane.CLOSED_OPTION) { animated = false; //On remplace nos boutons par nos JMenuItem lancer.setEnabled(true); arreter.setEnabled(false); //ON AJOUTE L'INSTRUCTION POUR LE MENU CONTEXTUEL //************************************************ launch.setEnabled(true); stop.setEnabled(false); play.setEnabled(true); cancel.setEnabled(false); } } } /* Lance le thread.*/ class PlayAnimation implements Runnable { public void run() { go(); } } /* Écoute les menus forme */ class FormeListener implements ActionListener { public void actionPerformed(ActionEvent e) { //si l'action vient d'un bouton radio du menu if(e.getSource().getClass().equals("javax.swing.JRadioButtonMenuItem")) pan.setForme(((JRadioButtonMenuItem)e.getSource()).getText()); else { if(e.getSource()==square) { carre.doClick(); } else if(e.getSource()==tri) { triangle.doClick(); } else if(e.getSource()==star) { etoile.doClick(); } else { rond.doClick(); } } } } /* Écoute le menu Morphing */ class MorphListener implements ActionListener { public void actionPerformed(ActionEvent e) { //Si la case est cochée, activation du mode morphing if(morph.isSelected())pan.setMorph(true); //Sinon rien ! else pan.setMorph(false); } } //class qui vont écouter le changement de couleurs //*************************************************** /* ecoute le changement de couleur du fond */ class CouleurFondListener implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==vertBack) pan.setCouleurFond(Color.green); else if(e.getSource()==bleuBack) pan.setCouleurFond(Color.blue); else if(e.getSource()==rougeBack) pan.setCouleurFond(Color.red); else pan.setCouleurFond(Color.white); } } /* ecoute le changement de couleur du fond*/ class CouleurFormeListener implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==vert) pan.setCouleurForme(Color.green); else if(e.getSource()==bleu) pan.setCouleurForme(Color.blue); else if(e.getSource()==rouge) pan.setCouleurForme(Color.red); else pan.setCouleurForme(Color.white); } } public static void main(String[]args) { FenetreTest fen=new FenetreTest(); } }
Bizarre... Ici tout semble fonctionner, marche/arrêt, les formes et le morphing.
ah bon,
quand à moi dès que je clique sur d'autre forme que le rond
prg bloque
quand mon prg bloque j' ai les erreur suivantes:
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at javax.swing.UIDefaults.getResourceCache(UIDefaults.java:297)
at javax.swing.UIDefaults.getFromResourceBundle(UIDefaults.java:289)
at javax.swing.UIDefaults.get(UIDefaults.java:163)
at javax.swing.MultiUIDefaults.get(MultiUIDefaults.java:64)
at javax.swing.UIDefaults.getBoolean(UIDefaults.java:570)
at javax.swing.UIManager.getBoolean(UIManager.java:867)
at javax.swing.DefaultButtonModel.setArmed(DefaultButtonModel.java:172)
at javax.swing.AbstractButton.doClick(AbstractButton.java:369)
at javax.swing.AbstractButton.doClick(AbstractButton.java:356)
at FenetreTest$FormeListener.actionPerformed(FenetreTest.java:397)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.AbstractButton.doClick(AbstractButton.java:356)
at FenetreTest$FormeListener.actionPerformed(FenetreTest.java:397)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402
.........
Salut,
Oui, ça bloque lorsqu'on utilise les boutons de Toolbar, parce il y a une grosse erreur dans ton listener :
Tu compares une instance de classe Class avec une instance de classe String, ce qui sera toujours false, donc on passera dans le else : le programme ne bloque pas, il fait une boucle infinie. Ce qui est revient au même en terme de conséquences :PCode:
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 class FormeListener implements ActionListener { public void actionPerformed(ActionEvent e) { //si l'action vient d'un bouton radio du menu if(e.getSource().getClass().equals("javax.swing.JRadioButtonMenuItem")) pan.setForme(((JRadioButtonMenuItem)e.getSource()).getText()); else { if(e.getSource()==square) { carre.doClick(); } else if(e.getSource()==tri) { triangle.doClick(); } else if(e.getSource()==star) { etoile.doClick(); } else { rond.doClick(); } } } }
Soit tu compares ce qui l'est :
ouCode:e.getSource().getClass().getName().equals("javax.swing.JRadioButtonMenuItem")
Ou mieux :Code:e.getSource().getClass().equals(javax.swing.JRadioButtonMenuItem.class)
Ou encore mieux, tu utilises les commandes sur tes boutons, comme ça tu n'es même pas obligé de faire de doClick().Code:e.getSource() instanceof javax.swing.JRadioButtonMenuItem
Sur tous tes boutons (JButton et radio), tu appelles setActionCommand
et dans le actionPerformmed :Code:carre.setActionCommand("CARRE");
Tu remarqueras au passage que le code est beaucoup plus court du coup :wink:Code:
1
2
3 public void actionPerformed(ActionEvent e) { pan.setForme(e.getActionCommand()); }
Et cette boucle infinie qui est caractérisée par la stackTrace que tu viens de poster.
Ok, merci beaucoup,j'ai corrigé mon erreur
et je continue dans mon prg