IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Afficher une grille de sudoku


Sujet :

avec Java

  1. #21
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    J'ai mis le code. Le programme marche toujours mais le code que j'ai rajouté ne fait rien.

  2. #22
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JusPomme Voir le message
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !!!");
        }
     
    });
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #23
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    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]));
    				}
     
    			}
    		} 
     
    	}
     
     
    }

  4. #24
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
         }
     
    });
    Et donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private void clicSurCase(int indX, int indY) {
    	System.out.println("Case cliquée x=" + indX + " y=" + indY + "!!!");
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #25
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    Je viens de mettre ce que tu m'a dis à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 + "!!!");
    				}
    à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    texteCase[indX][indY].addMouseListener(new MouseAdapter() {
     
    					    public void mouseClicked(MouseEvent e) {
    					           System.out.println("Case cliquée !!!");
    					    }
    					 });
    Il me dit que le void n'est pas compatible avec clicSurCase, cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void clicSurCase(int indX, int indY) {

  6. #26
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JusPomme Voir le message
    Je viens de mettre ce que tu m'a dis à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 + "!!!");
    				}
    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 !
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #27
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    				     }
     
    				});

  8. #28
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    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.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #29
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    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).

  10. #30
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    J'ai repris le dernier code que tu nous as montré et je l'ai modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    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;
     
    	}
     
    }
    Teste le programme et regarde ce que j'ai fait : rien d'autre que ce que j'ai indiqué.


    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private void toucheClavier(char keyChar) {
         System.out.println("Touche appuyée '" + keyChar + "'!!!");
    }
    Mets-là à côté de clicSurCase().

    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() :

    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
    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
    Ainsi dans toucheClavier(), on aura en paramètre un chiffre

    Donc maintenant, on a deux méthodes :
    1. clicSurCase(int x, int y)
    2. 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 :
    1. penser à faire que si une case est déjà en mode édition, elle quitte ce mode,
    2. que si la case est déjà en mode édition, on pourrait quitter le mode édition pour cette case.
    3. on ne doit pouvoir éditer qu'une case vide
    4. 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

    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
    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;
      }
    }
    C'est un début, parce que ça présente plusieurs problèmes :
    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)
    2. On ne peut pas effacer une saisie.
    3. 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.
    1. soit on fait un tableau de booléen avec true lorsqu'une case est vide, false sinon
    2. 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
    3. 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.

    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
    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;
        }
    }
    Il faut modifier la sauvegarde pour pouvoir sauvegarder les cases jouées :
    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
    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();
    				}
    			}
    		}
    	}
    Reste à faire une possibilité d'effacer la saisie. Et évidemment les tests pour savoir si la grille est résolue, ou non.
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    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
    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.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];
     
    	public void init() {
     
    		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;
    					}
    				}
    				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();
    		ecriture();
     
    	}
     
    	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;
    		}
    	}
     
    	// int[] table=new int[81];
     
    	public static void ecriture() {
    		// 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() {
    		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++;
    			}
    			/* ... 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];
    				modifCase[indX][indY] = 0;
    				if (valCase[indX][indY] == 0) {
    					texteCase[indX][indY].setLabel(""); // case vide
    				} else {
    					texteCase[indX][indY].setLabel(String.valueOf(valCase[indX][indY]));
    				}
     
    			}
    		}
    		return true;
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #31
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    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:
    soit on fait 2 tableaux et le second tableau sert à stocker les coups joués et on ne modifie jamais valCase pendant le jeu
    et aussi :
    Et évidemment les tests pour savoir si la grille est résolue, ou non.
    --> 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.
    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.

  12. #32
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JusPomme Voir le message
    Cependant je n'ais pas bien comprit cette partie:
    soit on fait 2 tableaux et le second tableau sert à stocker les coups joués et on ne modifie jamais valCase pendant le jeu
    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


    Citation Envoyé par JusPomme Voir le message
    et aussi :
    Et évidemment les tests pour savoir si la grille est résolue, ou non.
    --> 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.
    C'est bien ce dont je parlais.
    1. Lorsque toutes les cases vides sont remplies, et que les valeurs correspondent bien à celles qu'il faut, afficher que le joueur a réussi
    2. 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
    3. 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



    Citation Envoyé par JusPomme Voir le message

    Je me demandais si il était possible de générer une applet avec la grille complète et résolue.

    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.
    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


    Citation Envoyé par JusPomme Voir le message
    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.
    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 :

    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
    		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;
    			}
     
    		});
    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 correspondant

    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
    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;
    		}
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #33
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    Pour le menu, faut-il que je le fasse dans le même programme ? Si oui, je le mes a quel endroit ?

  14. #34
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Oui, bien sûr, dans le même programme.

    Au début de ta méthode init() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void init() {
     
    		setJMenuBar(creerMenus());
     
              /*... le reste du code ...*/
    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 : 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
     
    	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]));
    					}
    				}
    			}
    		}
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  15. #35
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    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 : 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
    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); 
        } 
    }

  16. #36
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JusPomme Voir le message
    -Comment faire pour mettre sur le même programme ?
    Regarde ce que j'ai montré dans mon dernier post. J'ai utilisé la même techique que toi, mais dans ton programme.
    Citation Envoyé par JusPomme Voir le message
    -Comment relier les boutons a mon programmes pour qu'ils ouvrent la bonne interface avec la liste des grilles ect... ?
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    		menus.add(creerMenuOuvrirGrille());
    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
     
    	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;
    	}
    Evidemment, il faut modifier la méthode lecture pour lui ajouter un paramètre (le nom du fichier).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...*/
    Maintenant, comment déterminer la liste des grilles.

    On peut tout simplement faire la liste des fichiers existant, en retirer l'extension
    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
    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
    					}
    				}
    Sinon, il y a la technique du dialogue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String[] grilles = /*...*/
    JList<String> jlist = new JList<>(grilles);
    JOptionPane.showMessageDialog(null, jlist);
    String choix = jlist.getSelectedValue();

    Citation Envoyé par JusPomme Voir le message
    Question optionnel:
    -Comment rendre le menu un peu plus attrayant, avec des couleurs par exemple.
    Il y a différentes solutions :
    1. Tu peux choisir une couleur de fond (la variable menu, c'est celle du type JMenuItem ou JMenu) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      menu.setBackground(Color.YELLOW);
    2. Tu peux choisir une couleur de police
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      menu.setForeground(Color.BLUE);
    3. Tu peux éventuellement mettre une bordure :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      menu.setBorder(BorderFactory.createLineBorder(Color.RED));
    4. Tu peux mettre certains mots en couleur (je reprends la ligne dans mon code)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      menus.add(creerMenu("<html>Remise à <font color='red'>zéro</font> grille","RAZ"));
    5. Tu peux mettre une icône
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      menu.setIcon(new ImageIcon(sudo1.class.getResource("monimage.png")));
      Le fichier monimage.png doit être mis dans le même dossier que la classe sudo1
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  17. #37
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    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

    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
    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
    							}
    						}
    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.

  18. #38
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Il faut mettre le code dans le bon ordre et au bon endroit :

    ça c'est dans creerMenus()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menus.add(creerMenuOuvrirGrille());
    et ça c'est une nouvelle méthode dans la classe sudo1

    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
    		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;
    		}
    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).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  19. #39
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 31
    Par défaut
    Oui d'accord mais je n'ai toujours pas comprit ou il fallait le mettre celui-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menus.add(creerMenuOuvrirGrille());
    J'ai essayer de le mettre a plusieurs endroits et à chaque fois il me met une croix rouge.

    Et sinon j'ai toujours des erreurs que je n'arrive pas à résoudre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private JMenu creerMenuOuvrirGrille() {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File[] files = dossier.listFiles(new FileFilter() {

  20. #40
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    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;
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/05/2014, 09h52
  2. Erreur code: besoin d'aide
    Par cmbelgique dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/11/2007, 15h09
  3. Je besoin d'aide pour terminer mon code
    Par Paulinho dans le forum C++
    Réponses: 7
    Dernier message: 07/11/2005, 00h30
  4. Débutant en C++ a besoin d'aide por son code
    Par Paulinho dans le forum C++
    Réponses: 9
    Dernier message: 08/10/2005, 09h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo