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

 Java Discussion :

Modifier le nb de cases d'une grille


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut Modifier le nb de cases d'une grille
    Bonjour.

    Etudiant, j'ai un projet à faire, un jeu en l'occurrence.
    Il y a une grille (comme un damier) de boutons, et ça fonctionne.

    Etape suivante: je souhaiterais pouvoir réinitialiser le jeu avec un nombre de cases différentes (choix de difficulté), sans avoir à arrêter et relancer le programme (par clic sur un bouton autre, par ex).
    C'est du MVC, et intercepter les clics n'est pas un pb (les écouteurs fonctionnent).

    Mais comment redimensionner la grille du jeu? La redessiner avec un autre nombre de cases, une fois qu'elle a déjà été dessinée (VueJeu, et this.pack du test pour redimensionner la fenêtre)? Comment modifier quelque chose créé par un new:
    - this.grille = new...
    - GridLayout jeu=new...
    Le tout dans la seule fenêtre de départ, sans engendrer une seconde fenêtre bien sûr.
    Bien sûr aussi cette opération réinitialise complètement le jeu (rien à conserver de la partie précédente).

    Merci.
    Ci-dessous quelques extraits de ce qui pourrait vous être utile, sur ce qui est fait, et comment c'est fait.

    -----------------

    Constructeur du test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    super ("LeJeu");
    LeJeu dem=new LeJeu(this);
    VueJeu vj=new VueJeu(dem);
    this.add(vj,BorderLayout.CENTER);
    ...
    this.pack();
    this.setVisible(true);
    Constructeur du Jeu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //déclaration préalable hors du constructeur: private char[][] grille;
    this.nbx=9; //x=nb cases horizontales
    this.nby=9; //y=nb cases verticales
    //(il y a un get et un set pour modifier nbx et nby)
    this.grille = new char [this.nbx][this.nby]; //tableau en mémoire correspondant au jeu
    Constructeur de la VueJeu:
    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
    super() ;
    this.dem=d; //d est le jeu passé en paramètre
    GridLayout jeu=new GridLayout (this.dem.getnby(), this.dem.getnbx());
    this.setLayout(jeu);
     
    EcouteurCase eCase=new EcouteurCase(this.dem);
     
    for (int y=0; y<this.dem.getnby(); y++)
    {
        for (int x=0; x<this.dem.getnbx(); x++)
        {
            JButton jb= (new JButton ("   "));
     
            jb.setMargin( new Insets(3,3,3,3));
            jb.setBorder( BorderFactory.createRaisedBevelBorder());
            jb.setContentAreaFilled(false);
     
            jb.setOpaque(true); //pour pouvoir changer ensuite couleur du bouton, sinon met couleur de bordure seulement
            jb.setName(x+","+y); //nom du bouton = ses coordonnées, par ex "3,4"
     
            this.add (jb);
            jb.addMouseListener(eCase);
        }
    }
    dem.ajoutVue(this);

  2. #2
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Bonjour,

    Alors déjà c'est une bonne idée de mettre du code pour préciser ton problème mais essaye d'utiliser les balises adaptées sinon tu ne donnes pas trop envie aux gens de lire tes messages.

    Ensuite pour modifier le nombre de cases de la grille rien ne t'empêche de créer une méthode dans VueJeu où tu feras quelque chose comme ça:
    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
     
    /* Ce sont les grandes lignes, après à toi de voir comment le faire dans les détails */
    for (Component component : getComponents()) {
      // désabonne l'écouteur de tous les anciens boutons
      if (component instanceof JButton) {
        ((JButton)component).removeListener(eCase);
      }
    }
     
    removeAll(); // enlève tous les anciens boutons de ta vue
     
    // Change le nombre de lignes et de colonnes
    GridLayout gridLayout = ((GridLayout)getLayout());
    gridLayout.setRows(...);
    gridLayout.setColumns(...);
     
    ... // et là tu ajoutes les nouveaux boutons, il y a sûrement du code en commun avec ton constructeur
     
    revalidate(); // force la réorganisation de tous les boutons

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Une autre possibilité est de ne pas utiliser de bouton pour l'interaction.
    Si tu utilise une zone de jeu (JPanel par exemple) et que tu utilise les coordonnées (x,y) pour déduire la case.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CaseEnX=positionSourieEnX%(largeur/nombreDeCaseEnX)
    CaseEnY=positionSourieEnY%(hauteur/nombreDeCaseEnY)
    Ainsi tu n'as plus à gérer l'ajout ou la suppression de bouton, mais que l'affichage en fonction de "nombreDeCaseEnX" et "nombreDeCaseEnY".
    Une modification de taille se résumerait alors à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nombreDeCaseEnX=newX;
    nombreDeCaseEnY=newY;
    monJPanelDeJeu.repaint();
    Sinon la solution de -gma- est bien, bien que la suppression des Listener ne soit à mon avis pas nécessaire vue que les composants/boutons seront détruit pac le GC.

    Cordialement,
    K
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut
    Bonsoir.

    1) Effectivement, étant nouveau, je ne connaissais pas cette fonctionnalité de balise code, mes excuses.
    Merci au modérateur d'avoir corrigé et à vous tous de m'avoir pardonné...

    2) Merci pour les suggestions de java: je ne connaissais pas du tout ces instructions et possibilités.
    Dès que je pourrai m'y remettre, j'essaierai d'appliquer ça (notamment plutôt la 1ère solution; mais la seconde m'a aussi instruit et intéressé).

    Bonne fin de semaine.
    Daniel

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut
    Bonjour.
    Je reviens un peu tardivement, car absent pour la Pentecôte.

    La solution (miraculeuse) de "gma" fonctionne et répond bien à mon pb, merci beaucoup. Je ne connaissais pas du tout ces instructions. ça redessine bien comme espéré.

    Restent 2 questions:

    1) selon le nombre de cases, les boutons dessinés sont parfois plus rectangulaires, parfois carrés; comment figer leur taille pour que quel que soit le nb de cases, la taille des boutons reste identique?
    A tout hasard, si besoin était, je rajoute le code qui déclarait mes boutons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    JButton jb= (new JButton ("   "));
    jb.setMargin( new Insets(3,3,3,3));
    jb.setBorder( BorderFactory.createRaisedBevelBorder());
    jb.setContentAreaFilled(false);
    jb.setOpaque(true); //pour pouvoir changer ensuite couleur du bouton, sinon met couleur de bordure seulement
    jb.setName(x+","+y); //nom du bouton = ses coordonnées, par ex "3,4"
    this.add (jb);
    jb.addMouseListener(eCase);
    2) Ceci dit, est-ce que par hasard il existerait aussi une fonction pour redimensionner un tableau, déclaré avec "new", comme par ex ces deux cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.grille = new char [this.nbx][this.nby];
    this.horiz=new boolean[dem.getnbx()*dem.getnby()];
    Si on change la taille de la grille (valeurs nbx et nby changent), comment réajuster la taille des tableaux "grille" ou de "horiz"?
    (Précision: la ligne "this.horiz=..." se trouve dans le constructeur de l'écouteur).

    Merci beaucoup encore.
    Bon w-e.
    Daniel

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut
    Un petit rectificatif pour la question n° 1:
    Je pense que ce n'est pas la taille des boutons qu'il faut revoir.
    En effet, les boutons sont dans un GridLayout d'une vue. Donc je pense que c'est plutôt la taille des cellules de la GridLayout qu'il faudrait pouvoir ajuster.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vj=new VueJeu(dem);
    this.add(vj,BorderLayout.CENTER);
    ...
    //ailleurs:
    jeu=new GridLayout (this.dem.getnby(), this.dem.getnbx());
    this.setLayout(jeu);
    ...
    this.add (jb);

  7. #7
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    1) En effet, le GridLayout divise l'espace disponible en rectangles de la même taille. Pour contrôler la taille des éléments, on peut passer par un GridBagLayout (un peu plus compliqué) ou utiliser des Box imbriquées (plus facile à mettre en œuvre mais moins élégant).

    2) On ne peut pas redimensionner un tableau. Il faut soit passer par des Collections soit créer un nouveau tableau.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut
    Merci, ton aide m'a été d'un grand secours et très utile et instructive.
    Bon w-e.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment définir les cases d'une grille Tkinter?
    Par rom29 dans le forum Tkinter
    Réponses: 3
    Dernier message: 14/05/2015, 19h19
  2. modifier une case d'une liste de structures
    Par kronoss dans le forum C#
    Réponses: 5
    Dernier message: 02/05/2010, 09h22
  3. Afficher et modifier le contenu d'une grille
    Par tiboleo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 31/03/2010, 10h49
  4. Repérer un nombre de cases dans une grille
    Par timtim2007 dans le forum Prolog
    Réponses: 3
    Dernier message: 18/05/2007, 18h42
  5. modifier une grille MSH
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/02/2007, 11h53

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