Bonjour,
J'essaie de faire un jeu de Yams en Java et je rencontre quelques difficultés, notamment liées au rafraichissement du panel.
Je n'en suis qu'au début, donc tout ce que peut faire mon programme est :
- Afficher cinq dés avec une valeur prise au hasard
- Relancer les dés en reprenant des valeurs au hasard
Je ne me suis pas encore aventuré plus loin, puisque je bloque sur la source. Dans le jeu du Yams, il faut sélectionner des dés, soit ceux que l'on va garder, soit ceux que l'on souhaite changer, cela n'a pas d'importance pour l'instant.
J'aimerais déjà faire afficher au programme sur quel dé est-ce que je clique : si je clique sur le premier il affiche 1, sur le second il affiche 2, etc. Simple.
Mon problème est que cela ne marche plus une fois que j'ai relancé les dés, le nom de la source semblant avoir changé. Cela vient de ma classe Frame, elle est divisée en deux :
- Le constructeur construit les éléments qui ne bougeront pas, puis appelle la fonction afficherFrame()
- La fonction afficherFrame() créé et affiche les cinq dés, qui sont des JCanvas.
J'ai effectué ce découpage de façon à ce que lorsque l'on clique sur le bouton de Lancement, on génère de nouvelles valeurs de dés et on relance directement afficherFrame, qui va actualiser les JCanvas des dés. Le souci, c'est que j'ai l'impression que les dés sont mis les uns par-dessus les autres (pour que ça ne se voie pas, je commence par dessiner un rectangle blanc). Cela pourrait être la cause de mon problème, puisqu'il semblerait qu'à chaque nouvelle recréation, la source du clic ne réponde plus correctement.
Le bouton de lancement de dés est créé par le constructeur de la Frame, et sa source fonctionne toujours. Par contre, si je le créé seulement à l'intérieur de la fonction afficherFrame, il subit le même sort que les dés et sa source cesse de fonctionner après la première réactualisation.
Quelqu'un peut-il m'expliquer d'où vient le problème ? Je pense qu'une cause de la résolution serait un petit coup de main sur le nettoyage du code en vue d'un rafraichissement propre du panel et des JCanvas ! Merci
Classe principale : GUI.java
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 import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class GUI { public Frame f1; public GUI() { De d1= new De(); JCanvas j1 = new JCanvas(d1); De d2= new De(); JCanvas j2 = new JCanvas(d2); De d3= new De(); De d4= new De(); De d5= new De(); Frame f1 = new Frame(j1,j2,d3,d4,d5); // Un peu patchwork, c'était pour tester ce qu'il se passait en fonction des endroits où on recréait les canvas this.f1=f1; f1.boutonlancer.addMouseListener(new ClicMouseAdapter()); f1.j1.addMouseListener(new ClicMouseAdapter()); f1.j2.addMouseListener(new ClicMouseAdapter()); f1.j3.addMouseListener(new ClicMouseAdapter()); f1.j4.addMouseListener(new ClicMouseAdapter()); f1.j5.addMouseListener(new ClicMouseAdapter()); } void refreshGUI() { De d1= new De(); JCanvas j1 = new JCanvas(d1); De d2= new De(); JCanvas j2 = new JCanvas(d2); De d3= new De(); De d4= new De(); De d5= new De(); f1.afficherFrame(j1,j2,d3,d4,d5); // Un peu patchwork, c'était pour tester ce qu'il se passait en fonction des endroits où on recréait les canvas } public class ClicMouseAdapter extends MouseAdapter { public ClicMouseAdapter() { } public void mouseClicked(MouseEvent arg0) { Object source = arg0.getSource(); if(source==f1.boutonlancer) // Si la source est le bouton de lancer, alors on lance la fonction de refresh et on affiche Lancer dans la console { refreshGUI(); System.out.println("Lancer"); } else if(source==f1.j1) // Si la source est le premier dé, alors on affiche 1 dans la console. { System.out.println("1"); } else // Sinon, on affiche No check dans la console System.out.println("No check"); } } public static void main(String[] args) { new GUI(); } }
Classe qui fait chier : Frame.java
Classe pour initialiser un dé : De.java
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 import java.awt.Color; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Frame extends JFrame { private static final long serialVersionUID = 1L; public JButton boutonlancer; public JPanel panel; public JFrame frame; public JLabel lancer; public JCanvas j1; public JCanvas j2; public JCanvas j3; public JCanvas j4; public JCanvas j5; public Frame(JCanvas j1,JCanvas j2,De d3,De d4,De d5) { JFrame frame = new JFrame("Test"); this.frame=frame; frame.setBounds(720,365,240+8,320+30); JPanel panel = new JPanel(); this.panel=panel; JButton boutonlancer = new JButton(""); // Voilà le bouton de lancer this.boutonlancer=boutonlancer; boutonlancer.setBounds(200,265+11,35,35); boutonlancer.setBackground(Color.PINK); JLabel lancer = new JLabel("Go"); // Un texte "Go", pas important this.lancer=lancer; lancer.setBounds(210,250+11,35,10); panel.setBackground(Color.WHITE); afficherFrame(j1,j2,d3,d4,d5); // La fonction qui créé et affiche les JCanvas } public void afficherFrame(JCanvas j1,JCanvas j2,De d3,De d4,De d5) { panel.setLayout(null); // Pour utiliser setBounds à fond this.j1=j1; // Sur les deux premiers, la création se fait à l'extérieur. Le résultat est identique. panel.add(j1); j1.setBounds(5,265+11,35,35); this.j2=j2; panel.add(j2); j2.setBounds(44,265+11,35,35); JCanvas j3 = new JCanvas(d3); this.j3=j3; panel.add(j3); j3.setBounds(83,265+11,35,35); JCanvas j4 = new JCanvas(d4); this.j4=j4; panel.add(j4); j4.setBounds(122,265+11,35,35); JCanvas j5 = new JCanvas(d5); this.j5=j5; panel.add(j5); j5.setBounds(161,265+11,35,35); panel.add(boutonlancer); panel.add(lancer); frame.add(panel); frame.setVisible(true); } }
Classe qui gère les JCanvas, ne pose à priori par de problèmes : JCanvas.java
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 import java.util.Random; public class De { public int valeur; public De() { this.valeur=0; Random r = new Random(); int i = (r.nextInt(6))+1; this.valeur=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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; public class JCanvas extends JPanel { private static final long serialVersionUID = 1L; De d = new De(); public JCanvas(De d) { this.d=d; } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { Color c = g.getColor(); g.setColor(Color.WHITE); g.fillRect(0,0,34,34); // Gros carré blanc pour masquer les dés du dessous... pas la meilleure solution :( g.setColor(Color.BLACK); g.drawRect(0,0,34,34); if(d.valeur==1) { g.fillOval(13,13,8,8); } if(d.valeur==2) { g.fillOval(5,5,8,8); g.fillOval(21,21,8,8); } if(d.valeur==3) { g.fillOval(4,4,8,8); g.fillOval(13,13,8,8); g.fillOval(22,22,8,8); } if(d.valeur==4) { g.fillOval(4,4,8,8); g.fillOval(4,22,8,8); g.fillOval(22,22,8,8); g.fillOval(22,4,8,8); } if(d.valeur==5) { g.fillOval(4,4,8,8); g.fillOval(4,22,8,8); g.fillOval(13,13,8,8); g.fillOval(22,22,8,8); g.fillOval(22,4,8,8); } if(d.valeur==6) { g.fillOval(3,3,8,8); g.fillOval(3,13,8,8); g.fillOval(3,23,8,8); g.fillOval(23,3,8,8); g.fillOval(23,13,8,8); g.fillOval(23,23,8,8); } g.setColor(c); } }
Partager