J'ai mis le code. Le programme marche toujours mais le code que j'ai rajouté ne fait rien.
Version imprimable
J'ai mis le code. Le programme marche toujours mais le code que j'ai rajouté ne fait rien.
Même en cliquant sur un chiffre ?
Essaye alors la solution avec MouseListener :
Code:
1
2
3
4
5
6
7
8
9
10
11 // la ligne suivante c'est TON code texteCase[indX][indY] = new GLabel(String.valueOf(valCase[indX][indY]),bord+(1+indX)*espaceCase+(0.4+indX)*tailleCase, bord+(1+indY)*espaceCase+(0.6+indY)*tailleCase); // ça c'est ce que tu ajoutes juste après texteCase[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { System.out.println("Case cliquée !!!"); } });
La première fois que j'ai lancé l'applet j'ai double cliqué sur une case, et dans la console il y avait "Case cliqué !!!) j'ai essayé de mettre un chiffre, ça a pas marché.
J'ai relancé l'applet et là plus de "case cliqué !!" dans la console.
Je pense pas que ça marche.
Je l'ai peut-être pas mis au bon endroit. Je vais me coucher.
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 package sudo1; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import acm.graphics.GLabel; import acm.graphics.GRect; import acm.program.GraphicsProgram; public class sudo1 extends GraphicsProgram{ /** * " */ private static final long serialVersionUID = 1L; public GRect fond; public int bord = 100; public int tailleCase = 50 ; public int espaceCase = 10 ; public GRect [][] bloc = new GRect[3][3]; public GRect [][] cellule = new GRect[9][9]; public static int [][] valCase = new int [9][9]; public int [][] modifCase = new int [9][9]; public static GLabel [][] texteCase = new GLabel[9][9]; void mouseDoubleClick(MouseEvent e) { } public void init() { fond = new GRect(bord,bord,9*tailleCase+10*espaceCase,9*tailleCase+10*espaceCase); fond.setFillColor(Color.BLUE); fond.setFilled(true); add(fond); //Création des blocs 3x3 : for (int indX=0; indX<3;indX++) { for (int indY=0; indY<3;indY++) { bloc[indX][indY]= new GRect(bord+espaceCase+indX*3*espaceCase+indX*3*tailleCase,bord+espaceCase+indY*3*espaceCase+indY*3*tailleCase, 3*tailleCase+2*espaceCase,3*tailleCase+2*espaceCase); bloc[indX][indY].setFillColor(Color.WHITE); bloc[indX][indY].setFilled(true); add(bloc[indX][indY]); } } // création des cases : for (int indX=0; indX<9;indX++) { for (int indY=0; indY<9;indY++) { cellule[indX][indY]= new GRect(bord+(1+indX)*espaceCase+indX*tailleCase,bord+(1+indY)*espaceCase+indY*tailleCase, tailleCase,tailleCase); cellule[indX][indY].setFillColor(Color.LIGHT_GRAY); cellule[indX][indY].setFilled(true); add(cellule[indX][indY]); valCase[indX][indY]=indX; texteCase[indX][indY] = new GLabel(String.valueOf(valCase[indX][indY]),bord+(1+indX)*espaceCase+(0.4+indX)*tailleCase, bord+(1+indY)*espaceCase+(0.6+indY)*tailleCase); texteCase[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { System.out.println("Case cliquée !!!"); } }); add(texteCase[indX][indY]); } } try { lecture(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } ecriture(); } protected void clicSurCase(int indX, int indY) { // TODO Auto-generated method stub } int[] table=new int[81]; public static void ecriture() { String ligne ; int nombre = 123; int[] table=new int[81]; for (int indX=0; indX<9;indX++) { for (int indY=0; indY<9;indY++) { table[indX+9*indY] = valCase[indX][indY]; } } BufferedWriter fichier = null; try { fichier = new BufferedWriter(new FileWriter("Toto.txt")); // et là tu écris chaque valeur de table dans le fichier for(int index=0; index<table.length; index++) { fichier.write( String.valueOf( table[index])); fichier.newLine(); // pour passer à la ligne } } catch (IOException e) { e.printStackTrace(); } finally { if ( fichier != null ) { try { fichier.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void lecture() throws IOException { int table[] = new int[100]; // un tableau suffisamment grand pour lire une grille de 9x9 devrait faire 81 cases, mais 100 ça fonctionne BufferedReader Lecteur = null; try { Lecteur = new BufferedReader(new FileReader("Toto.txt")); // remplis ici ta grille String ligne; // pas besoin d'un tableau, puisqu'on lit ligne à ligne int index = 0; // déclaration et initialisation dans la même instruction while ((ligne = Lecteur.readLine()) != null) { System.out.println("ligne : " + index + " > " + ligne); table[index]=Integer.parseInt(ligne); index++; } /*... remplissage de la grille graphique (GLabel ou autre) ...*/ } catch(FileNotFoundException exc) { System.out.println("erreur"); exc.printStackTrace(); // il est toujours intéressant de connaitre l'erreur si on veut pouvoir la traiter } finally { // s'exécute toujours if ( Lecteur!=null ) { try { Lecteur.close(); } catch( IOException exc) { System.out.println("Fichier mal fermé"); exc.printStackTrace(); } } } for (int indX=0; indX<9;indX++) { for (int indY=0; indY<9;indY++) { valCase[indX][indY]= table[indX+9*indY]; if ( valCase[indX][indY]==0 ) { texteCase[indX][indY].setLabel(""); // case vide } else { texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY])); } } } } }
Le problème vient du fait que l'écouteur ne doit pas être mis sur le GLabel qui n'est que le chiffre affiché, mais sur le GRect qui constitue toute la case :
Et donc :Code:
1
2
3
4
5
6
7
8
9 final int caseX = indX; final int caseY = indY; cellule[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { clicSurCase(caseX, caseY); } });
Code:
1
2
3 private void clicSurCase(int indX, int indY) { System.out.println("Case cliquée x=" + indX + " y=" + indY + "!!!"); }
Je viens de mettre ce que tu m'a dis à savoir :
à la place de :Code:
1
2
3
4
5
6
7
8
9
10
11
12 final int caseX = indX; final int caseY = indY; cellule[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { clicSurCase(caseX, caseY); } }); private void clicSurCase ;int indX1; int indY1; { System.out.println("Case cliquée x=" + indX1 + " y=" + indY1 + "!!!"); }
Il me dit que le void n'est pas compatible avec clicSurCase, cette ligne:Code:
1
2
3
4
5
6 texteCase[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { System.out.println("Case cliquée !!!"); } });
Code:private void clicSurCase(int indX, int indY) {
Oui, mais là tu définis (ce que j'ai surligné en jaune) une méthode en plein milieu d'une autre : c'est interdit ça. Elle existe déjà dans ton code la méthode clicSurCase() et au bon endroit. A noter que si je l'ai mise dans une balise CODE différente c'est bien parce qu'elle n'était pas juste à la suite de l'autre code !
D'accord, si il est déjà présent je n'ais pas besoin de le remettre du coup.
Il fallait que je garde mon ancien bout de code et que je rajoute le premier que tu m'as donné ?
ça donnerait ceci:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 texteCase[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { System.out.println("Case cliquée !!!"); } }); final int caseX = indX; final int caseY = indY; cellule[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { clicSurCase(caseX, caseY); } });
Le mouseListener sur texteCase, tu peux l'enlever (il ne fonctionne que si on clique exactement sur le chiffre au milieu de la case grise). C'est pour ça que tu avais l'impression qu'il marchait que certaines fois : c'était quand par hasard tu cliquais exactement sur le chiffre.
J'ai tenté de le supprimé mais ça m'affiche des erreurs après donc je l'ais remit.
J'ai essayer de clické sur le chiffre en plein millieur ça m'affiche bien "Case cliquée !!!" dans la console mais impossible de modifier le chiffre. De plus ça ne marche pas là ou il n'y a pas de chiffre (un 0 dans le fichier).
J'ai repris le dernier code que tu nous as montré et je l'ai modifié :
Teste le programme et regarde ce que j'ai fait : rien d'autre que ce que j'ai indiqué.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 package sudo1; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import acm.graphics.GLabel; import acm.graphics.GRect; import acm.program.GraphicsProgram; public class sudo1 extends GraphicsProgram { /** * * " */ private static final long serialVersionUID = 1L; public GRect fond; public int bord = 100; public int tailleCase = 50; public int espaceCase = 10; public GRect[][] bloc = new GRect[3][3]; public GRect[][] cellule = new GRect[9][9]; public static int[][] valCase = new int[9][9]; public static int[][] modifCase = new int[9][9]; public static GLabel[][] texteCase = new GLabel[9][9]; void mouseDoubleClick(MouseEvent e) { } public void init() { fond = new GRect(bord, bord, 9 * tailleCase + 10 * espaceCase, 9 * tailleCase + 10 * espaceCase); fond.setFillColor(Color.BLUE); fond.setFilled(true); add(fond); // Création des blocs 3x3 : for (int indX = 0; indX < 3; indX++) { for (int indY = 0; indY < 3; indY++) { bloc[indX][indY] = new GRect(bord + espaceCase + indX * 3 * espaceCase + indX * 3 * tailleCase, bord + espaceCase + indY * 3 * espaceCase + indY * 3 * tailleCase, 3 * tailleCase + 2 * espaceCase, 3 * tailleCase + 2 * espaceCase); bloc[indX][indY].setFillColor(Color.WHITE); bloc[indX][indY].setFilled(true); add(bloc[indX][indY]); } } // création des cases : for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { cellule[indX][indY] = new GRect(bord + (1 + indX) * espaceCase + indX * tailleCase, bord + (1 + indY) * espaceCase + indY * tailleCase, tailleCase, tailleCase); cellule[indX][indY].setFillColor(Color.LIGHT_GRAY); cellule[indX][indY].setFilled(true); add(cellule[indX][indY]); valCase[indX][indY] = indX; texteCase[indX][indY] = new GLabel(String.valueOf(valCase[indX][indY]), bord + (1 + indX) * espaceCase + (0.4 + indX) * tailleCase, bord + (1 + indY) * espaceCase + (0.6 + indY) * tailleCase); final int caseX = indX; final int caseY = indY; cellule[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { clicSurCase(caseX, caseY); } }); add(texteCase[indX][indY]); } } lecture(); ecriture(); } private void clicSurCase(int indX, int indY) { System.out.println("Case cliquée x=" + indX + " y=" + indY + "!!!"); } public static void ecriture() { int[] table = new int[9*9]; for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { table[indX + 9 * indY] = valCase[indX][indY]; } } BufferedWriter fichier = null; try { fichier = new BufferedWriter(new FileWriter("Toto.txt")); for (int index = 0; index < table.length; index++) { fichier.write(String.valueOf(table[index])); fichier.newLine(); // pour passer à la ligne } } catch (IOException e) { e.printStackTrace(); } finally { if (fichier != null) { try { fichier.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static boolean lecture() { int table[] = new int[9*9]; BufferedReader Lecteur = null; try { Lecteur = new BufferedReader(new FileReader("Toto.txt")); String ligne; int index = 0; while ((ligne = Lecteur.readLine()) != null) { System.out.println("ligne : " + index + " > " + ligne); table[index] = Integer.parseInt(ligne); index++; } } catch (IOException exc) { System.out.println("erreur"); exc.printStackTrace(); return false; } catch (NumberFormatException exc) { System.out.println("erreur: format incorrect"); exc.printStackTrace(); return false; } finally { if (Lecteur != null) { try { Lecteur.close(); } catch (IOException exc) { System.out.println("Fichier mal fermé"); exc.printStackTrace(); } } } for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { valCase[indX][indY] = table[indX + 9 * indY]; if (valCase[indX][indY] == 0) { texteCase[indX][indY].setLabel(""); // case vide } else { texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY])); } } } return true; } }
Et c'est normal que tu ne puisses pas modifier le chiffre : tout ce qu'il se passe quand tu cliques avec la souris, et bien, c'est que tu sais qu'on a cliqué avec la souris... Déjà un GLabel est un composant d'affichage, pas de saisie. Donc pas possible de saisir dedans. Il va falloir faire du code pour gérer la saisie (ce que j'ai déjà écrit dans un de mes précédents messages).
Déjà, pour saisir au clavier, c'est comme pour la souris, il faut écouter le clavier. Un moyen simple dans ton cas est d'utiliser un KeyEventDispatcher(). Par exemple, on va procéder comme pour la souris.
Créer d'abord une méthode pour traiter les touches du clavier, comme on a fait une méthode clicSurCase() : il n'y aura plus qu'a mettre le traitement dedans.
Mets-là à côté de clicSurCase().Code:
1
2
3 private void toucheClavier(char keyChar) { System.out.println("Touche appuyée '" + keyChar + "'!!!"); }
Ensuite, pour le KeyEventDispatcher :
- on va écouter les touches de chiffres sauf le zéro (de 1 à 9 donc)
- on peut écouter aussi des touces pour effacer une saisie, pour permettre au joueur qui s'est trompé d'annuler un chiffre qu'il a saisit
Ajout ce code juste au début de la méthode init() :
Ainsi dans toucheClavier(), on aura en paramètre un chiffreCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public void init() { KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_TYPED) { // si on a tapé une touche if (e.getKeyChar() >= '1' && e.getKeyChar() <= '9') { // si cette touche est un chiffre entre 1 et 9 toucheClavier(e.getKeyChar()); // on appelle toucheClavier() avec ce chiffre return true; } } return false; } }); //... le reste de ton code
Donc maintenant, on a deux méthodes :
- clicSurCase(int x, int y)
- toucheClavier(char keyChar)
Lorsqu'on clique sur une case, clicSurCase est appelée avec les coordonnées de cette case. Lorsqu'on appuie une touche qu'on gère, toucheClavier est appelée avec la touche appuyée. Il faut mettre en relation ces 2 méthodes.
Lorsqu'on clique sur une case, on passe en mode "édition". Il faut déjà stocker la case qui est en édition, pour qu'on puisse la tester dans toucheClavier.
Il faut également :
- penser à faire que si une case est déjà en mode édition, elle quitte ce mode,
- que si la case est déjà en mode édition, on pourrait quitter le mode édition pour cette case.
- on ne doit pouvoir éditer qu'une case vide
- il faut indiquer à l'utilisateur quelle est la case qu'il est en train de modifier : pour ça on va par exemple changer la couleur de la case
Ensuite dans toucheClavier, il suffit que si une case est en édition, alors on lui applique le chiffre saisi. Pour gérer le mode édition, on va simplement gérer 2 int qui vont stocker les coordonnées de la case en cours d'édition
C'est un début, parce que ça présente plusieurs problèmes :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 private int derniereCaseX = -1; // le x de la case en cours d'édition private int derniereCaseY = -1; // le y de la case en cours d'édition private void clicSurCase(int indX, int indY) { System.out.println("Case cliquée x=" + indX + " y=" + indY + "!!!"); if (derniereCaseX != -1 && derniereCaseY != -1) { // une case est en édition cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); // on remet la couleur normale pour quitter le mode édition } if ( !(derniereCaseX == indX && derniereCaseY == indY) // si ce n'est pas la case actuellement en étidtion && valCase[indX][indY] == 0 ) { // si la nouvelle case est éditable (donc vide) derniereCaseX = indX; derniereCaseY = indY; cellule[derniereCaseX][derniereCaseY].setFillColor(Color.GREEN); // on affiche la case en vert pour dire qu'elle est en édition } else { // sinon on annule le mode édition derniereCaseX = -1; derniereCaseY = -1; } } private void toucheClavier(char keyChar) { System.out.println("Touche appuyée '" + keyChar + "'!!!"); if (derniereCaseX != -1 && derniereCaseY != -1) { // zi une case est en édition valCase[derniereCaseX][derniereCaseY] = keyChar - '0'; texteCase[derniereCaseX][derniereCaseY].setLabel(String.valueOf(valCase[derniereCaseX][derniereCaseY])); cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); derniereCaseX = -1; derniereCaseY = -1; } }
- On ne peut pas modifier plusieurs fois un chiffre : on a pas le droit de se tromper (ça pourrait être un mode de difficulté, mais c'est quand même plus sympa de pouvoir annuler une saisie)
- On ne peut pas effacer une saisie.
- Il n'y a aucun contrôle : on devrait à chaque saisie tester si la grille est résolue, ou indiquer lorsque que la saisie est forcément en erreur (le même chiffre plusieurs fois dans la même ligne par exemple)
Pour pouvoir saisir plusieurs fois dans la même case, le problème vient du fait que quand on saisie on modifie le table valCase : dès qu'on a saisit, on a oublié que la case était vide au début, et donc on ne peut plus la modifier. Il faut donc mémoriser les cases vides. D'une manière ou d'une autre.
- soit on fait un tableau de booléen avec true lorsqu'une case est vide, false sinon
- soit on fait 2 tableaux, et on conserve une version non modifiée qui nous permet de savoir par comparaison si une case est modifiée
- soit on fait 2 tableaux et le second tableau sert à stocker les coups joués et on ne modifie jamais valCase pendant le jeu
On va utiliser la troisième méthode. Tu as prévu dans tes variables un tableau modifCase : on va utiliser ce tableau pour faire ça. Chaque fois qu'on joue, au lieu de modifier valCase, ou va modifier modifCase. Les valeurs de modifCase différentes de 0 seront les cases modifiées.
Il faut modifier la sauvegarde pour pouvoir sauvegarder les cases jouées :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 private int derniereCaseX = -1; private int derniereCaseY = -1; private void clicSurCase(int indX, int indY) { System.out.println("Case cliquée x=" + indX + " y=" + indY + "!!!"); if (derniereCaseX != -1 && derniereCaseY != -1) { // une case est en édition cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); // on remet la couleur normale } if ( !(derniereCaseX == indX && derniereCaseY == indY) // si ce n'est pas la case actuellement en étidtion && (valCase[indX][indY] == 0 || modifCase[indX][indY] != 0)) { // si la nouvelle case est éditable derniereCaseX = indX; derniereCaseY = indY; cellule[derniereCaseX][derniereCaseY].setFillColor(Color.GREEN); } else { // sinon on annule le mode édition derniereCaseX = -1; derniereCaseY = -1; } } private void toucheClavier(char keyChar) { System.out.println("Touche appuyée '" + keyChar + "'!!!"); if (derniereCaseX != -1 && derniereCaseY != -1) { // une case est en édition modifCase[derniereCaseX][derniereCaseY] = keyChar - '0'; texteCase[derniereCaseX][derniereCaseY].setLabel(String.valueOf(modifCase[derniereCaseX][derniereCaseY])); cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); derniereCaseX = -1; derniereCaseY = -1; } }
Reste à faire une possibilité d'effacer la saisie. Et évidemment les tests pour savoir si la grille est résolue, ou non.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 public static void ecriture() { int[] table = new int[9*9]; for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { if (modifCase[indX][indY] != 0) { // la case a été jouée, on sauvegarde ce qui a été joué table[indX + 9 * indY] = modifCase[indX][indY]; } else { // sinon on sauvegarde la valeur d'origine table[indX + 9 * indY] = valCase[indX][indY]; } } } BufferedWriter fichier = null; try { fichier = new BufferedWriter(new FileWriter("Toto.txt")); // et là tu écris chaque valeur de table dans le fichier for (int index = 0; index < table.length; index++) { fichier.write(String.valueOf(table[index])); fichier.newLine(); // pour passer à la ligne } } catch (IOException e) { e.printStackTrace(); } finally { if (fichier != null) { try { fichier.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Je te laisse digérer tout ça et réfléchir au reste.
Voici le code complet de tout ce que je viens de dire :
Merci pour le temps que tu me consacres. Le programme marche bien. Effectivement on ne peut pas "enlever" une valeur qu'on a mise dans une case on peut seulement la remplacée mais je ne pense pas que ce soit un gros problème à mon niveaux.
Cependant je n'ais pas bien comprit cette partie:
et aussi :Citation:
soit on fait 2 tableaux et le second tableau sert à stocker les coups joués et on ne modifie jamais valCase pendant le jeu
--> Je sais pas si c'est ça mais j'ai prit une grille sur internet ( je sais on a pas le droit du a des "copyrights") donc normalement elle est réalisable (niveaux facile). Mais effectivement, il faudrait pouvoir savoir si l'utilisateur qui complète la grille a juste ou pas. Je me demandais si il était possible de générer une applet avec la grille complète et résolue.Citation:
Et évidemment les tests pour savoir si la grille est résolue, ou non.
Ce que j'aimerai faire est un menu très simple.
Par exemple:
1-Jouer -->là il propose plusieurs grilles pour choisir laquelle on veut faire, bien entendu elle serait numérotées. En l'occurrence il n'y en a que une mais je pense continuer mon programme même après l'évaluation pour le bac et donc ajouter d'autres grilles.
Ensuite on a un deuxième bouton.
2-Solutions --> là avec le même numéro de la grille qui se trouve dans "jouer" pour se repérer.
Les différents chiffres de ta grille sont stockées dans un tableau : valCase. C'est le tableau qu'on charge dans la méthode lecture().
Dans la première version de mon code (dans mon dernier post), lorsqu'on tape une touche, on modifie le tableau valCase. Et on perd donc le 0 qu'il y avait en l'écrasant par le chiffre correspondant à la touche tapée.
Pour éviter de le perdre, au lieu de modifier valCase, on va modifier un autre tableau, modifCase.
Ainsi, le tableau valCase ne change jamais pendant le jeu. Seul le tableau modifCase change.
On sait quelle valeur est en dans une case avec ces conditions :
- si la valeur de valCase[indx][indy] est un chiffre de 1 à 9, donc pas 0, alors c'est un chiffre de la grille d'origine, qu'on ne peut pas modifier
- si la valeur de valCase[indx][indy] vaut 0, alors c'est une case vide
Pour savoir si on a saisit quelque chose dans cette case vide, on regarde dans modifCase
- si modifCase[indx][indy] vaut 0, alors la case est toujours vide, on n'a pas joué dedans
- si modifCase[indx][indy] ne vaut pas 0, alors la case est jouée et la valeur de modifCase[indx][indy] est le chiffre qu'on a mis dans cette case
C'est bien ce dont je parlais.
- Lorsque toutes les cases vides sont remplies, et que les valeurs correspondent bien à celles qu'il faut, afficher que le joueur a réussi
- Lorsque toutes les cases vides sont remplies, et que les valeurs ne correspondent pas à celles qu'il faut, afficher que ce n'est pas la solution
- Le reste c'est du "nice to have" : par exemple, afficher en rouge les cases, s'il y a plusieurs fois le même chiffre dans une ligne, ou toute autre case qui contrevient aux règles du sudoku
Oui c'est ce qu'il faudrait faire. Tu peux faire plus simple :
- Un menu : charger grille. Il liste les fichiers qui existent. Il y a deux types de ficheirs : des grilles à jouer, et des sauvegardes utilisateurs.
- Un menu : sauvegarder.
- Un menu : voir solution.
En utilisant le nom du fichier comme identifiant de grille
Ce n'est pas très difficile à faire et je peux t'expliquer comment faire.
Déjà, il faut traiter les touches du clavier qui servent à effacer :
Pour traiter l'effacement, il suffit de tester si keyChar est une espace, et de vider la case par modfiCase[indx][indy]=0, et le GLabel correspondantCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_TYPED) { if (e.getKeyChar() >= '1' && e.getKeyChar() <= '9') { toucheClavier(e.getKeyChar()); return true; } else if (e.getKeyChar() == ' ') { // si la touche est espace on efface toucheClavier(' '); // on envoie toujours espace pour effacer return true; } } else if (e.getID() == KeyEvent.KEY_PRESSED) { // si une touche est enfoncée if (e.getKeyCode() == KeyEvent.VK_DELETE || e.getKeyCode() == KeyEvent.VK_BACK_SPACE) { // si la touche est suppr ou backspace, on efface toucheClavier(' '); // on envoie toujours espace pour effacer return true; } } return false; } });
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 private void toucheClavier(char keyChar) { System.out.println("Touche appuyée '" + keyChar + "'!!!"); if (derniereCaseX != -1 && derniereCaseY != -1) { // une case est en édition if (keyChar == ' ') { // effacement de la saisie modifCase[derniereCaseX][derniereCaseY] = 0; texteCase[derniereCaseX][derniereCaseY].setLabel(""); } else { modifCase[derniereCaseX][derniereCaseY] = keyChar - '0'; texteCase[derniereCaseX][derniereCaseY] .setLabel(String.valueOf(modifCase[derniereCaseX][derniereCaseY])); } cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); derniereCaseX = -1; derniereCaseY = -1; } }
Pour le menu, faut-il que je le fasse dans le même programme ? Si oui, je le mes a quel endroit ?
Oui, bien sûr, dans le même programme.
Au début de ta méthode init() :
Puis tu ajoutes une méthode creerMenus() dans ta classe sudo1. Je te donne un exemple avec un menu qui remet à zéro toute la grille en cours.Code:
1
2
3
4
5 public void init() { setJMenuBar(creerMenus()); /*... le reste du code ...*/
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 private ActionListener menuActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { executeMenu(e.getActionCommand()); } }; private JMenuBar creerMenus() { JMenuBar menuBar = new JMenuBar(); JMenu menus = new JMenu("Mes menus"); menuBar.add(menus); menus.add(creerMenu("Remise à zéro grille","RAZ")); // on ajoute un menu return menuBar; } /** * @param libelle le texte du menu * @param commande la commande associée */ private JMenuItem creerMenu(String libelle, String commande) { JMenuItem menu = new JMenuItem(libelle); menu.addActionListener(menuActionListener); menu.setActionCommand(commande); return menu; } private void executeMenu(String commande) { switch( commande ) { case "RAZ": remiseAZeroGrille(); break; } } /** *efface toutes les cases déjà jouées et annule la saisie en cours */ private void remiseAZeroGrille() { if ( derniereCaseX!=-1 && derniereCaseY!=-1 ) { cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); derniereCaseX = -1; derniereCaseY = -1; } for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { if (modifCase[indX][indY] != 0) { modifCase[indX][indY] = 0; if ( valCase[indX][indY]==0 ) { texteCase[indX][indY].setLabel(""); } else { texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY])); } } } } }
J'ai cherche comment faire un menu et je crois avoir trouver.
Cependant j'ai du créer une autre class dans mon projet. Il n'est donc pas lié a mon projet...
J'ai fais les 2 boutons qui m'intéressait cependant il ne mène a rien.
Mes questions sont donc:
-Comment faire pour mettre sur le même programme ?
-Comment relier les boutons a mon programmes pour qu'ils ouvrent la bonne interface avec la liste des grilles ect... ?
Question optionnel:
-Comment rendre le menu un peu plus attrayant, avec des couleurs par exemple.
Le code du menu:
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 package sudo1; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.UIManager; public class Test extends JFrame{ public Test(){ setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(300, 300); setLocationRelativeTo(null); setJMenuBar(new MyJMenuBar()); //juste pour le fun JPanel p = new JPanel(); p.add(new JButton("Jouer")); p.add(new JButton("Solutions")); setContentPane(p); } public static void main(String[] args) { new Test().setVisible(true); } } class MyJMenuBar extends JMenuBar{ MyJMenuBar(){ JMenu menuFile = new JMenu("File"); menuFile.setMnemonic('f'); JMenuItem itemQuit = new JMenuItem("Quit"); itemQuit.setMnemonic('q'); itemQuit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); menuFile.add(itemQuit); add(menuFile); } }
Regarde ce que j'ai montré dans mon dernier post. J'ai utilisé la même techique que toi, mais dans ton programme.
En JTF, j'en sais rien. Mais on peut fairce ça en Swing.
Tout d'abord, on pourrait faire ça avec un menu, dans le menu.
Dans creerMenus on ajoute
Code:menus.add(creerMenuOuvrirGrille());
Evidemment, il faut modifier la méthode lecture pour lui ajouter un paramètre (le nom du fichier).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 private JMenu creerMenuOuvrirGrille() { final JMenu menu = new JMenu("Ouvrir une grille"); // on recréer le menu à chaque fois parce que la liste des fichiers va changer à chaque sauvegarde menu.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { menu.removeAll(); // on supprime tous les sous-menus existant String[] grilles = /*...*/ for(String grille : grilles ) { JMenuItem item = new JMenuItem(grille); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { lecture(grille); } }); menu.add(item); } } @Override public void menuDeselected(MenuEvent e) { } @Override public void menuCanceled(MenuEvent e) { } }); return menu; }
Maintenant, comment déterminer la liste des grilles.Code:
1
2
3
4
5
6
7 public static boolean lecture(String nomfichier) { int table[] = new int[9*9]; BufferedReader Lecteur = null; try { Lecteur = new BufferedReader(new FileReader(nomfichier)); /*...etc...*/
On peut tout simplement faire la liste des fichiers existant, en retirer l'extension
Sinon, il y a la technique du dialogue :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 File dossier = new File("").getAbsoluteFile(); // comme tu utilises le dossier par défaut (et non un dossier déterminé), il faut faire ça pour obtenir son emplacement File[] files = dossier.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isFile() && file.getName().endsWith(".txt"); // on ne prend que les fichiers qui se terminent par .txt } }); String[] grilles; if ( files==null ) { // s'il n'y a aucun fichier grilles = new String[0]; } else { grilles = new String[files.length]; for(int i=0; i<files.length; i++) { grilles[i]=files[i].getName(); grilles[i]=grilles[i].substring(0,files[i].getName().lastIndexOf('.')); // on supprime l'extension pour l'affichage } }
Code:
1
2
3
4 String[] grilles = /*...*/ JList<String> jlist = new JList<>(grilles); JOptionPane.showMessageDialog(null, jlist); String choix = jlist.getSelectedValue();
Il y a différentes solutions :
- Tu peux choisir une couleur de fond (la variable menu, c'est celle du type JMenuItem ou JMenu) :
Code:menu.setBackground(Color.YELLOW);
- Tu peux choisir une couleur de police
Code:menu.setForeground(Color.BLUE);
- Tu peux éventuellement mettre une bordure :
Code:menu.setBorder(BorderFactory.createLineBorder(Color.RED));
- Tu peux mettre certains mots en couleur (je reprends la ligne dans mon code)
Code:menus.add(creerMenu("<html>Remise à <font color='red'>zéro</font> grille","RAZ"));
- Tu peux mettre une icône
Le fichier monimage.png doit être mis dans le même dossier que la classe sudo1Code:menu.setIcon(new ImageIcon(sudo1.class.getResource("monimage.png")));
Bon du coup j'ai mis les codes que tu m'a donné. J'ai modifié des trucs car il y avait pas mal de croix rouge et j'arrive pas a les supprimer pour certaines, si tu peux y jeter un coup d’œil ;)
Et sinon, quand j'essaie de mettre mon code qui est sur une autre classe (celui qui ouvre le menu avec les 2 boutons) je le mes juste après "menus.add(creerMenuOuvrirGrille());" et j'ai des erreurs partout. Enfin je pense j'ai pas tous compris.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 menus.add(creerMenuOuvrirGrille()); private JMenu creerMenuOuvrirGrille() { final JMenu menu = new JMenu("Ouvrir une grille"); // on recréer le menu à chaque fois parce que la liste des fichiers va changer à chaque sauvegarde menu.addMenuListener(new MenuListener() { public void menuSelected(MenuEvent e) { menu.removeAll(); // on supprime tous les sous-menus existant String[] grilles ; /*...*/ for(String grille : grilles ) { JMenuItem item = new JMenuItem(grille); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { lecture(); } }); menu.add(item); } } public void menuDeselected(MenuEvent e) { } public void menuCanceled(MenuEvent e) { } }); return; } File dossier = new File("").getAbsoluteFile(); // comme tu utilises le dossier par défaut (et non un dossier déterminé), il faut faire ça pour obtenir son emplacement File[] files = dossier.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isFile() && file.getName().endsWith(".txt"); // on ne prend que les fichiers qui se terminent par .txt } }); String[] grilles; if ( files==null ) { // s'il n'y a aucun fichier grilles = new String[0]; } else { grilles = new String[files.length]; for(int i=0; i<files.length; i++) { grilles[i]=files[i].getName(); grilles[i]=grilles[i].substring(0,files[i].getName().lastIndexOf('.')); // on supprime l'extension pour l'affichage } }
Il faut mettre le code dans le bon ordre et au bon endroit :
ça c'est dans creerMenus()
et ça c'est une nouvelle méthode dans la classe sudo1Code:menus.add(creerMenuOuvrirGrille());
Il ne faut pas supprimer le passage du paramètre à la méthode lecture(), comme tu l'as fait : il faut le passer en paramètre de la méthode lecture sinon comment veux-tu que la méthode lecture sache quel fichier a été sélectionné dans le menu ? Il faut donc l'ajouter dans la déclaration de la méthode (que j'ai mise dans mon message d'ailleurs).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 private JMenu creerMenuOuvrirGrille() { final JMenu menu = new JMenu("Ouvrir une grille"); // on recréer le menu à chaque fois parce que la liste des fichiers va changer à chaque sauvegarde menu.addMenuListener(new MenuListener() { public void menuSelected(MenuEvent e) { menu.removeAll(); // on supprime tous les sous-menus existant File dossier = new File("").getAbsoluteFile(); // comme tu utilises le dossier par défaut (et non un dossier déterminé), il faut faire ça pour obtenir son emplacement File[] files = dossier.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isFile() && file.getName().endsWith(".txt"); // on ne prend que les fichiers qui se terminent par .txt } }); String[] grilles; if ( files==null ) { // s'il n'y a aucun fichier grilles = new String[0]; } else { grilles = new String[files.length]; for(int i=0; i<files.length; i++) { grilles[i]=files[i].getName(); grilles[i]=grilles[i].substring(0,files[i].getName().lastIndexOf('.')); // on supprime l'extension pour l'affichage } } for(String grille : grilles ) { JMenuItem item = new JMenuItem(grille); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { lecture(grille); } }); menu.add(item); } } public void menuDeselected(MenuEvent e) { } public void menuCanceled(MenuEvent e) { } }); return; }
Oui d'accord mais je n'ai toujours pas comprit ou il fallait le mettre celui-là :
J'ai essayer de le mettre a plusieurs endroits et à chaque fois il me met une croix rouge.Code:menus.add(creerMenuOuvrirGrille());
Et sinon j'ai toujours des erreurs que je n'arrive pas à résoudre.
Code:private JMenu creerMenuOuvrirGrille() {
Code:File[] files = dossier.listFiles(new FileFilter() {
Code:lecture(grille);
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 package sudo1; import java.awt.Color; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; 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 java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import acm.graphics.GLabel; import acm.graphics.GRect; import acm.program.GraphicsProgram; public class sudo1 extends GraphicsProgram { /** * * " */ private static final long serialVersionUID = 1L; public GRect fond; public int bord = 100; public int tailleCase = 50; public int espaceCase = 10; public GRect[][] bloc = new GRect[3][3]; public GRect[][] cellule = new GRect[9][9]; public static int[][] valCase = new int[9][9]; public static int[][] modifCase = new int[9][9]; public static GLabel[][] texteCase = new GLabel[9][9]; void mouseDoubleClick(MouseEvent e) { } public void init() { setJMenuBar(creerMenus()); KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_TYPED) { if (e.getKeyChar() >= '1' && e.getKeyChar() <= '9') { toucheClavier(e.getKeyChar()); return true; } else if (e.getKeyChar() == ' ') { toucheClavier(' '); return true; } } else if (e.getID() == KeyEvent.KEY_PRESSED) { if (e.getKeyCode() == KeyEvent.VK_DELETE || e.getKeyCode() == KeyEvent.VK_BACK_SPACE) { toucheClavier(' '); return true; } } return false; } }); fond = new GRect(bord, bord, 9 * tailleCase + 10 * espaceCase, 9 * tailleCase + 10 * espaceCase); fond.setFillColor(Color.BLUE); fond.setFilled(true); add(fond); // Création des blocs 3x3 : for (int indX = 0; indX < 3; indX++) { for (int indY = 0; indY < 3; indY++) { bloc[indX][indY] = new GRect(bord + espaceCase + indX * 3 * espaceCase + indX * 3 * tailleCase, bord + espaceCase + indY * 3 * espaceCase + indY * 3 * tailleCase, 3 * tailleCase + 2 * espaceCase, 3 * tailleCase + 2 * espaceCase); bloc[indX][indY].setFillColor(Color.WHITE); bloc[indX][indY].setFilled(true); add(bloc[indX][indY]); } } // création des cases : for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { cellule[indX][indY] = new GRect(bord + (1 + indX) * espaceCase + indX * tailleCase, bord + (1 + indY) * espaceCase + indY * tailleCase, tailleCase, tailleCase); cellule[indX][indY].setFillColor(Color.LIGHT_GRAY); cellule[indX][indY].setFilled(true); add(cellule[indX][indY]); valCase[indX][indY] = indX; texteCase[indX][indY] = new GLabel(String.valueOf(valCase[indX][indY]), bord + (1 + indX) * espaceCase + (0.4 + indX) * tailleCase, bord + (1 + indY) * espaceCase + (0.6 + indY) * tailleCase); final int caseX = indX; final int caseY = indY; cellule[indX][indY].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { clicSurCase(caseX, caseY); } }); add(texteCase[indX][indY]); } } //lecture("Toto.txt"); //ecriture(); } private ActionListener menuActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { executeMenu(e.getActionCommand()); } }; private JMenuBar creerMenus() { JMenuBar menuBar = new JMenuBar(); JMenu menus = new JMenu("Mes menus"); menuBar.add(menus); menus.add(creerMenu("Remise à zérogrille","RAZ")); menus.add(creerMenuOuvrirGrille()); return menuBar; } private JMenu creerMenuOuvrirGrille() { final JMenu menu = new JMenu("Ouvrir une grille"); // on recréer le menu à chaque fois parce que la liste des fichiers va changer à chaque sauvegarde menu.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { menu.removeAll(); File[] files = new File("").getAbsoluteFile().listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isFile() && file.getName().endsWith(".txt"); } }); String[] grilles; if ( files==null ) { grilles = new String[0]; } else { grilles = new String[files.length]; for(int i=0; i<files.length; i++) { grilles[i]=files[i].getName(); System.out.println(files[i].getName()); grilles[i]=grilles[i].substring(0,files[i].getName().lastIndexOf('.')); } } for(String grille : grilles ) { JMenuItem item = new JMenuItem(grille); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { lecture(grille+".txt"); } }); menu.add(item); } } @Override public void menuDeselected(MenuEvent e) { } @Override public void menuCanceled(MenuEvent e) { } }); return menu; } private JMenuItem creerMenu(String libelle, String commande) { JMenuItem menu = new JMenuItem(libelle); menu.addActionListener(menuActionListener); menu.setActionCommand(commande); return menu; } private void executeMenu(String commande) { switch( commande ) { case "RAZ": remiseAZeroGrille(); break; } } private void remiseAZeroGrille() { if ( derniereCaseX!=-1 && derniereCaseY!=-1 ) { cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); derniereCaseX = -1; derniereCaseY = -1; } for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { if (modifCase[indX][indY] != 0) { modifCase[indX][indY] = 0; if ( valCase[indX][indY]==0 ) { texteCase[indX][indY].setLabel(""); } else { texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY])); } } } } } private int derniereCaseX = -1; private int derniereCaseY = -1; private void clicSurCase(int indX, int indY) { System.out.println("Case cliquée x=" + indX + " y=" + indY + "!!!"); if (derniereCaseX != -1 && derniereCaseY != -1) { // une case est en édition cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); // on remet la couleur normale } if (!(derniereCaseX == indX && derniereCaseY == indY) // si ce n'est pas la case actuellement en étidtion && (valCase[indX][indY] == 0 || modifCase[indX][indY] != 0)) { // si la nouvelle case est éditable derniereCaseX = indX; derniereCaseY = indY; cellule[derniereCaseX][derniereCaseY].setFillColor(Color.GREEN); } else { // sinon on annule le mode édition derniereCaseX = -1; derniereCaseY = -1; } } private void toucheClavier(char keyChar) { System.out.println("Touche appuyée '" + keyChar + "'!!!"); if (derniereCaseX != -1 && derniereCaseY != -1) { // une case est en édition if (keyChar == ' ') { // effacement modifCase[derniereCaseX][derniereCaseY] = 0; texteCase[derniereCaseX][derniereCaseY].setLabel(""); } else { modifCase[derniereCaseX][derniereCaseY] = keyChar - '0'; texteCase[derniereCaseX][derniereCaseY] .setLabel(String.valueOf(modifCase[derniereCaseX][derniereCaseY])); } cellule[derniereCaseX][derniereCaseY].setFillColor(Color.LIGHT_GRAY); derniereCaseX = -1; derniereCaseY = -1; } } // int[] table=new int[81]; public static void ecriture() { System.out.println(new File("Toto.txt").getAbsolutePath()); System.out.println(new File("Toto.txt").exists()); // String ligne; // int nombre = 123; int[] table = new int[9*9]; for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { if (modifCase[indX][indY] != 0) { table[indX + 9 * indY] = modifCase[indX][indY]; } else { table[indX + 9 * indY] = valCase[indX][indY]; } } } BufferedWriter fichier = null; try { fichier = new BufferedWriter(new FileWriter("Toto.txt")); // et là tu écris chaque valeur de table dans le fichier for (int index = 0; index < table.length; index++) { fichier.write(String.valueOf(table[index])); fichier.newLine(); // pour passer à la ligne } } catch (IOException e) { e.printStackTrace(); } finally { if (fichier != null) { try { fichier.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static boolean lecture(String nomfichier) { int table[] = new int[9*9]; BufferedReader Lecteur = null; try { Lecteur = new BufferedReader(new FileReader(nomfichier)); String ligne; int index = 0; while ((ligne = Lecteur.readLine()) != null) { System.out.println("ligne : " + index + " > " + ligne); table[index] = Integer.parseInt(ligne); index++; } /* ... remplissage de la grille graphique (GLabel ou autre) ... */ } catch (IOException exc) { System.out.println("erreur"); exc.printStackTrace(); // il est toujours intéressant de connaitre // l'erreur si on veut pouvoir la traiter return false; } catch (NumberFormatException exc) { System.out.println("erreur: format incorrect"); exc.printStackTrace(); // il est toujours intéressant de connaitre // l'erreur si on veut pouvoir la traiter return false; } finally { // s'exécute toujours if (Lecteur != null) { try { Lecteur.close(); } catch (IOException exc) { System.out.println("Fichier mal fermé"); exc.printStackTrace(); } } } for (int indX = 0; indX < 9; indX++) { for (int indY = 0; indY < 9; indY++) { valCase[indX][indY] = table[indX + 9 * indY]; if (valCase[indX][indY] == 0) { texteCase[indX][indY].setLabel(""); // case vide } else { texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY])); } } } return true; } }