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

AWT/Swing Java Discussion :

Bataille navale avec interface graphique.


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut Bataille navale avec interface graphique.
    Bonjour,

    Dans le cadre de ma deuxième année de prépa intégrée, je dois réaliser une bataille navale avec interface graphique (j'ai sélectionné SWING) avec un mode de jeu contre l'ordinateur. Globalement, j'ai saisi comment développer à peu près toutes les fonctionnalités telles que le placement des bateaux, les tirs etc. J'ai pris le parti de créer une classe Case contenant des JButton afin d'exploiter les interactions des JButton par la suite (la classe est jointe ci-dessous).

    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
     package bataillenavale;
     
    import javax.swing.JButton;
     
    /**
     *
     * @author Utilisateur
     */
    public class Case {
        private JButton button;
        private final int x;
        private final int y;
        protected int valeur;
     
        public Case(int x0, int y0){
            x=x0;
            y=y0;
            button = new JButton("0");
        }
     
    }
    J'aimerai donc réussir à afficher une grille de dimension 10 x 10 composée de Cases. Cependant, je n'arrive pas à ajouter lesdites Cases au sein d'un JPanel pour les afficher. Sauriez-vous m'aider ? Je vous joins le code, qui bloque au niveau de la ligne 30. J'ai vraiment besoin de me sortir de ce problème afin de pouvoir avancer sur le reste du problème.

    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
    package bataillenavale;
     
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.util.ArrayList;
    import javax.swing.JPanel;
     
    /**
     *
     * @author Utilisateur
     */
    public class Plateau {
        private JPanel affichage;
     
        public Plateau(){
            JPanel grille = new JPanel();
            affichage = new JPanel();
            affichage.setLayout(new BorderLayout());
            ArrayList<Case> listecases = new ArrayList();
            grille = new JPanel();
            grille.setLayout(new GridLayout(11,11));
            for(int i=0;i<11;i++){
                for(int j=0;j<11;j++){
                    listecases.add(new Case(i,j));
                    grille.add(listecases);
                }
     
            }
        }
    }
    En vous remerciant.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu as oublié d'ajouter le JPanel "grille" dans le JPanel "affichage".

    Sinon, c'est une très mauvaise pratique de placer pleins de JButton comme ça. Il est préférable d'afficher une image (BufferedImage) et de gérer complètement les interactions souris en fonction de sa position sur l'image. Le code sera plus simple et l'interface plus souple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    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 : 55
    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
    Salut,

    Il n'y a pas que le problème de l'ajout de la grille dans le panel affichage (si tant est que ce dernier est bien mis lui-même dans une fenêtre).

    Personnellement, je préfère également faire ce genre d'interface en Java2D + images, parce que ça permet de faire quelque chose de plus joli et plus souple, mais si tu veux continuer avec des composants Swing, il faut penser qu'un Conteneur Swing (Container) ne peut contenir que des Composants Swing (classe JComponent au moins).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    JPanel grille = new JPanel();  // grille est un JPanel
    /**...**/
    ArrayList<Case> listecases = new ArrayList(); // listecases est une liste de Case (d'ailleurs ce serait plus propre de faire List<Case> listecases = new ArrayList<>(), ne serait-ce déjà pour éviter le warning (les chevrons à droite) et pour parce que je ne pense pas que tu aies besoin de traiter ta liste spécifiquement comme une ArrayList (l'interface List est suffisante pour la manipulation)
    grille = new JPanel(); // on récrée un nouveau panel qui remplace le précédent : cette ligne est inutile
    /**...**/
     
    for(int i=0;i<11;i++){
                for(int j=0;j<11;j++){
                    listecases.add(new Case(i,j)); // on ajoute une instance de Case dans la liste
                    grille.add(listecases); // on ajoute la liste d'instances de Case dans un JPanel : il n'existe aucune méthode qui permettent d'ajouter une liste de Case (qui n'est pas un composant Swing en plus) dans un JPanel : ça ne compile donc pas
                 }       
    }
    C'est le bouton qui se trouve référencé dans la variable button de l'instance de Case qu'il faudrait ajouter à la grille (donc avoir un accesseur), pas la liste de cases, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int i=0;i<11;i++){
                for(int j=0;j<11;j++){
                    Case lacase = new Case(i,j);
                    listecases.add(lacase); // on ajoute une instance de Case dans la liste
                    grille.add(lacase.getButton()); // par exemple, si tu ajoutes une méthode JButton getButton() dans Case, qui fait return button
                 }       
    }
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Je vais essayer de me pencher du coup sur l'idée d'utiliser des images.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 22
    Par défaut
    Pour être honnête, j'ai fais pas mal de recherches et je n'arrive pas à m'en sortir pour le moment. Sauriez-vous m'aider pour une exemple de grille créée comme ce dont vous parlez ?
    Actuellement, je me retrouve avec une grille de Jbutton qui affichent des images, mais je me retrouve confrontés aux problèmes de base et j'ai du mal à visualiser comment récupérer une valeur et la position "derrière" un bouton. J'aurais besoin d'aiguillage, pour être honnête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Plateau extends JPanel{
     
        public Plateau(){
            this.setSize(100,100);
            this.setLayout(new GridLayout(10,10));
            for(int j=1;j<101;j++){  
               this.add(new JButton(new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg")));
            }
     
        }
        public void ActionPerform(ActionEvent e){
            System.out.println(this.getLocation());
        }
    }
    Merci beaucoup encore ...

  6. #6
    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 : 55
    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
    Salut,

    Premièrement, pour détecter une action sur le bouton, il faut un ActionListener :

    1. A l'ancienne par classe :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      button.addActionListener( une classe qui implémente l'interface ActionListener )
    2. Par expression lambda
      [CODE]button.addActionListener( event-> "un appel de méthode" )


    Dans les deux cas, une méthode sera implémentée : cette méthode doit pouvoir savoir quelle case de la grille a été sollicitée. Il faut donc un moyen de le faire. On peut gérer ça via une classe qui représente la classe, ou soit simplement avec des paramètres. Tout d'abord, il est toujours plus simple de gérer des index compris entre 0 et un max inclus. Les formules sont plus simples, les tests aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    final Icon grillevideicon = new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg"); // ici il sera préférable d'utiliser une ressource plutôt qu'un fichier
    final int size = 10;
    this.setLayout(new GridLayout(size,size)); // le GridLayout n'est pas forcément le meilleur choix, parce que la grille s'étend dans tout le composant (un GridBagLayout serait préférable je pense)
    for(int j=0,max=size*size;j<max;j++){  
               this.add(new JButton(grillevideicon));
    }
    Ensuite, partont sur principe d'une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private void caseClick(JButton button, int x, int y) {
    }
    On récupère le bouton ce qui permettra éventuellement de changer son état (changer l'icône par exemple). Et on récupère les coordonnées de la case, x pour les colonnes, y pour les lignes.

    Les formules pour passer d'un index j de 0 à max-1 à des coordonnées dans une grille sont simples :
    • y = j/nombre de colonnes
      la division étant entière, on obtient bien le numéro de ligne, de 0 à nombre de lignes-1
    • x = j%nombre de colonnes
      le reste de la division entière est le numéro de colonne, de à nombre de colonnes - 1
    • on retrouve j à partir de x et y : j = y*nombre de colonnes + x


    Donc on peut écrire :

    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
    public class Plateau extends JPanel{
     
        private static final int SIZE = 10; // nombre de lignes et colonnes
     
        public Plateau() {
            this.setSize(100,100); // ça ne sert à rien si le panel est géré par un Layout Manager (sauf exception, comme avec certains layout absolu)
            final Icon grillevideicon = new ImageIcon("C:\\Users\\Utilisateur\\Pictures\\grille_vide.jpg"); // ici il sera préférable d'utiliser une ressource plutôt qu'un fichier
            this.setLayout(new GridLayout(SIZE,SIZE)); // le GridLayout n'est pas forcément le meilleur choix, parce que la grille s'étend dans tout le composant (un GridBagLayout serait préférable je pense)
            for(int j=0,max=SIZE*SIZE;j<max;j++){  
               JButton button = new JButton(grillevideicon);
               button.addActionListener(event->caseClick(button, j/SIZE, j%SIZE);
               this.add(button);
            }
     
        }
        private void caseClick(JButton button, int x, int y) {
            // là tu mets le code à exécuter quand on clique sur la case
            System.out.println("Vous avez cliqué la case colonne="+x+", ligne="+y+".");
        }
    }
    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.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/05/2007, 14h33
  2. Réponses: 2
    Dernier message: 27/10/2006, 18h54
  3. Débugger avec interface graphique
    Par powerpsy dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 03/05/2006, 22h53
  4. Application multiplateforme avec interface graphique
    Par TNorth dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 31/01/2004, 18h55

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