Mettre à jour le contenu d'une fenêtre

Résolu
Giac Messages postés 1366 Statut Membre -  
Giac Messages postés 1366 Statut Membre -
Bonjour,

Suite à mon précédent post, j'aimerais savoir comment faire pour mettre à jour le contenu de ma fenêtre quand je clique sur l'un des boutons de commande.

Dans le programme, j'ai créé une classe pour ouvrir ma fenêtre, m'affichant un tableau de boutons dont seuls quartes sont actifs (haut, bas, gauche, droite et reset). Dans cette classe, j'ai créé une procédure dans laquelle je donne les actions à effectuer quand l'utilisateur appuie sur un des boutons de commande. J'ai déjà essayé de faire marcher le truc vite fait dans la console et tout vas très bien, mais quand je fait afficher le jeu dans la fenêtre, rien ne se passe quand j'appuie sur les boutons de commande.

Merci d'avance pour votre aide.

--
May Google be with you!!

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    (Re)Bonsoir,

    Il faudrait voir comment tu as fait ton code, en particulier sur le lien entre les boutons et le démarrage des actions.

    Est-ce que tu utilises une proglet particulière ?
    0
    1. Giac Messages postés 1366 Statut Membre 275
       
      J'ai fait une classe "JFrame implements Action listner" dans laquelle j'ai créé le tableau de boutons et j'ai affecté des couleurs aux boutons en fonction du contenu que j'ai dans un tableau d'entiers prédéfini.
      Dans la classe, j'ai créé un procédure "public void actionPerformed(ActionEvent clic)" dans laquelle je fait effectuer les actions pour faire bouger la valeur représentant le pacman dans le tableau d'entier quand on clique sur un des boutons et je ne trouve pas comment changer l'apparence des boutons après ça...

      Je travail dans la projet "Manuel ISN", je ne sais pas si ça changera grand chose de passer dans "Java prog"...
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      Est-ce que l'action s'exécute ou pas du tout ?
      Dans ton constructeur as-tu pensé à faire un
      addActionListener(this)
      ?
      0
    3. Giac Messages postés 1366 Statut Membre 275
       
      j'ai un
      boutons[n][m].addActionListener(this);
      pour écouter chacun des boutons du tableau puis j'ai un
      boutons[n][m].setEnabled(false);
      pour désactiver les boutons dont je ne me sert pas.
      0
    4. Giac Messages postés 1366 Statut Membre 275
       
      J'ai essayé de mettre un
      Fenetre.repaint();
      (pour refaire ma fenêtre) mais j'ai cette erreur :
      Erreur de syntaxe ligne 203 :
      non-static method repaint() cannot be referenced from a static context
      Fenetre.repaint();
      ^
      0
    5. Giac Messages postés 1366 Statut Membre 275
       
      Après quelques recherches, j'ai mis :

      getContentPane().removeAll();
      getContentPane().validate();


      au début de la procédure d'actionEvent clic pour effacer ce que j'ai sur mon panneau puis, à la fin :

      getContentPane().revalidate();
      getContentPane().repaint();

      Pour ré afficher le panneau une fois les modifications faites, mais quand j'appuie sur un bouton, tout s'efface.
      0
  2. Giac Messages postés 1366 Statut Membre 275
     
    Voici le code sans les essais non concluants de rafraichissement du contenu de la fenêtre. Je ne suis pas tout seul sur le code, c'est un travail de groupe et je m'occupe de la partie affichage en particulier donc je ne suis pas à l'origine du reste mais j'ai compris ce qu'il se passe. Pour ce qui est de la commande du jeu, je préfère garder le code comme il est...

    import java.awt.GridLayout;
    import java.awt.Color;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    class Fenetre extends JFrame implements ActionListener{

    //Initialisation du tableau des déplacements interdits
    int[][] Labyrinthe = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
    {1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
    {1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
    {1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1},
    {1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
    {1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1},
    {1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1},
    {1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1},
    {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
    {1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
    {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
    int Y=1;
    int X=1;

    //Instanciation et construction d'un JPanel qui sera le "volet contenu" de notre fenêtre
    JPanel pan = new JPanel();
    //Instanciation et construction d'un tableau de 13*15 boutons
    JButton[][] boutons= new JButton[15][13];

    //Constructeur de la fenêtre
    Fenetre(){
    pan.setBackground(Color.BLACK);
    //Taille de la fenêtre
    this.setSize(600, 650);
    //Positionnement de la fenêtre
    this.setLocation(0, 0);
    //Agencement du volet contenu en grille de dimension 13*15
    pan.setLayout(new GridLayout(15,13,5,5));
    for (int n=0;n<15;n++){
    for (int m=0;m<13;m++){
    //Instanciation et construction d'un bouton
    JButton bout=new JButton();
    //que l'on place dans la tableau aux coordonées (n;m)
    boutons[n][m]=bout;
    boutons[n][m].setBackground(Color.WHITE);
    //Ajout du bouton au volet contenu de la fen?tre
    pan.add(boutons[n][m]);
    //On demande à la fenêtre d'écouter chacun des boutons
    boutons[n][m].addActionListener(this);
    }
    }

    // Mise en place du Texte sur les Boutons de commande
    boutons[13][11].setText("Haut");
    boutons[14][10].setText("Gauche");
    boutons[14][11].setText("Bas");
    boutons[14][12].setText("Droite");
    //Mise n place de la coueur et du Texte du bouton "reset"
    boutons[13][12].setBackground(Color.GREEN);
    boutons[13][12].setText("Reset");

    //Définition des boutons représentant l'écran de jeu en fonction du tableau prédéfini au début
    for (int n=0;n<13;n++){
    for (int m=0;m<13;m++){
    //Obstacles
    if(Labyrinthe[n][m]==1){
    //Définition de la couleur du bouton
    boutons[n][m].setBackground(Color.BLACK);
    //Désactivation du bouton
    boutons[n][m].setEnabled(false);
    }
    //Cases vides
    if(Labyrinthe[n][m]==2){
    boutons[n][m].setBackground(Color.BLUE);
    boutons[n][m].setEnabled(false);
    }
    //Cases contenant une pac-gomme
    if(Labyrinthe[n][m]==0){
    boutons[n][m].setBackground(Color.WHITE);
    boutons[n][m].setEnabled(false);
    }
    //Case où se situe pacman
    if(Labyrinthe[n][m]==3){
    boutons[n][m].setBackground(Color.YELLOW);
    boutons[n][m].setEnabled(false);
    }
    }
    }

    //Définition des boutons ne servant pas
    for (int n=13;n<15;n++){
    for (int m=0;m<10;m++){
    //Définition de la couleur
    boutons[n][m].setBackground(Color.RED);
    //Désactivation du bouton
    boutons[n][m].setEnabled(false);
    }
    }
    //Désactivation d'un bouton
    boutons[13][10].setBackground(Color.RED);
    boutons[13][10].setEnabled(false);

    //Déclaration de "pan" comme volet contenu de la fenêtre
    this.setContentPane(pan);
    //Demande de rendre la fenêtre visible
    this.setVisible(true);
    }

    //Méthode permettant de "faire quelque chose" lorsque l'on a cliqué sur un des boutons
    public void actionPerformed(ActionEvent clic) {

    //Test pour savoir si le bouton (n;m) a été cliqué

    //Si l'on appuie sur le bouton Reset
    if (clic.getSource()==boutons[13][12]){
    //Effecer ce qui à été affiché en console
    clear();
    //Vérification des valeurs cases par cases
    for(int a=0; a<13; a++){
    for(int b=0; b<13; b++){
    //Pour toutes les cases différentes de 1 et 0, affecter 0 à la case
    if ((Labyrinthe[b][a]!=1) &&( Labyrinthe[b][a]!=0)){
    Labyrinthe[b][a]=0;
    X=1;
    Y=1;
    }
    }
    }

    //Remise de pacman à son point d'origine
    Labyrinthe[1][1]=3;

    }
    //si on appuie sur le bouton Haut
    if (clic.getSource()==boutons[13][11] && ((0<=Y) && (Y<=12))){
    // si la valeur de la case du haut est de 1, pacman ne bouge pas
    if (Labyrinthe[X-1][Y]==1){
    Labyrinthe[X][Y]=3;
    }else{
    //Sinon il va sur la case demandée
    Labyrinthe[X][Y]=2;
    Labyrinthe[X-1][Y]=3;
    X=X-1;
    }
    clear();
    }
    //si on appuie sur le bouton Gauche
    if (clic.getSource()==boutons[14][10]&& ((0<=X) && (X<=12))){
    //Si la valeur de la case de gauche est à 1, pacman ne bouge pas
    if (Labyrinthe[X][Y-1]==1){
    Labyrinthe[X][Y]=3;
    }else{
    // sinon il va sur la case demandée
    Labyrinthe[X][Y]=2;
    Labyrinthe[X][Y-1]=3;
    Y=Y-1;
    }
    clear();
    }
    //Si on appuie sur le bouton Bas
    if (clic.getSource()==boutons[14][11]&& ((0<=Y) && (Y<=12))){
    //Si la valeur de la case de dessous est à 1, pacman ne bouge pas
    if (Labyrinthe[X+1][Y]==1){
    Labyrinthe[X][Y]=3;
    }else{
    //Sinon il va sur la case demandée
    Labyrinthe[X][Y]=2;
    Labyrinthe[X+1][Y]=3;
    X=X+1;
    }
    clear();
    }
    //Si on appuie sur le bouton Droite
    if (clic.getSource()==boutons[14][12]&& ((0<=X) && (X<=12))){
    //Si la valeur de la case de droite est à 1, pacman ne bouge pas
    if (Labyrinthe[X][Y+1]==1){
    Labyrinthe[X][Y]=3;
    }else{
    // sinon il va sur la case demandée
    Labyrinthe[X][Y]=2;
    Labyrinthe[X][Y+1]=3;
    Y=Y+1;
    }
    clear();
    }

    //Affichage numérique dans la console
    for(int a=0; a<13; a++){
    for(int b=0; b<13; b++){
    System.out.print(" "+Labyrinthe[a][b]+" ");
    }
    println(" ");
    }

    }
    }

    void main() {
    //instanciation et construction d'une fenêtre
    Fenetre fen = new Fenetre();
    }

    Merci encore pour le temps que tu m'accorde.
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Alors...

      Lorsque tu fais une action pour l'instant la seule chose que ça fait c'est changer la valeur du tableau.

      // si on appuie sur le bouton Haut
      if (clic.getSource() == boutons[13][11] && ( (0 <= Y) && (Y <= 12)))
      {
          // si la valeur de la case du haut est de 1, pacman ne bouge pas
          if (Labyrinthe[X - 1][Y] == 1)
          {
              Labyrinthe[X][Y] = 3;
          }
          else
          {
              // Sinon il va sur la case demandée
              Labyrinthe[X][Y] = 2;
              Labyrinthe[X - 1][Y] = 3;
              X = X - 1;
          }
          clear();
      }

      Mais cela ne suffit pas, car il faut aussi changer tes boutons (ça ne va pas se faire tout seul).

          else
          {
              // Sinon il va sur la case demandée
              Labyrinthe[X][Y] = 2;
              boutons[X][Y].setBackground(Color.WHITE);
              Labyrinthe[X - 1][Y] = 3;
              boutons[X - 1][Y].setBackground(Color.YELLOW);
              X = X - 1;
          }

      Du coup, pas besoin de repaint, ça va se faire tout seul.

      Pour en revenir aux quelques conseils que je te donnais hier, je trouve vraiment dommage de faire
      boutons[n][m].addActionListener(this);
      c'est à dire de mettre le même listener pour tous les boutons, alors qu'il n'y a que 5 boutons sur lesquels on va appuyer et qu'ils vont tous faire une action différente.

      Tu pourrais faire ainsi qui est plus propre :

      // Mise en place du Texte sur les Boutons de commande
      boutons[13][11].setText("↑");
      boutons[13][11].addActionListener(new ActionListener() 
      {
          public void actionPerformed(ActionEvent e)
          {
              if (X==0) // on ne peut pas faire Labyrinthe[X-1][Y]
                  return; 
      
              // si la valeur de la case du haut est de 1, pacman ne bouge pas
              if (Labyrinthe[X - 1][Y] == 1)
              {
                  Labyrinthe[X][Y] = 3; // inutile non ? pac-man est déjà là...
              }
              else
              {
                  // Sinon il va sur la case demandée
                  Labyrinthe[X][Y] = 2;
                  boutons[X][Y].setBackground(Color.WHITE);
                  Labyrinthe[X - 1][Y] = 3;
                  boutons[X - 1][Y].setBackground(Color.YELLOW);
                  X = X - 1;
              }
          }
      });

      Et pareil pour les 4 autres boutons...
      0
    2. Giac Messages postés 1366 Statut Membre 275
       
      Désolé de répondre aussi tard, mais j'avais des dossiers à faire donc je ne me suis pas trop penché dessus, mais c'est bon, ça marche enfin, merci beaucoup, grâce à ton aide, je pourrais présenter un programme qui marche.

      Merci pour le temps que ça a du te prendre =D
      0