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 :

Plateau d'Hexagones avec Java.awt et Java.swing


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Points : 37
    Points
    37
    Par défaut Plateau d'Hexagones avec Java.awt et Java.swing
    Bonjour,

    Je souhaite générer des Hexagones dans ma fenêtre en les disposant selon les contraintes du GridBagLayout.
    Ça fonctionne avec des JButtons (en activant la ligne 30 de la classe Plateau) mais rien ne s'affiche pour les Hexagones, impossible de trouver pourquoi...

    Voici mon code :

    Classe Hexagone
    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
     
    import java.awt.BorderLayout;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.LayoutManager;
    import javax.swing.JPanel;
     
    public class Hexagone extends JPanel{
     
    	public Hexagone(){}
     
    	public void paintComponent(Graphics g){
    	    int x[] = {20, 30, 50, 60, 50, 30};
    	    int y[] = {40, 20, 20, 40, 60, 60};
    	    g.drawPolygon(x, y, 6);
    	}
    }
    Classe Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import javax.swing.JFrame;
     
    public class Initialisation {
     
    	public static void main(String[] args) {
    		JFrame f = new JFrame();
    		f.setSize(600, 600);
    		f.setLocationRelativeTo(null);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.add(new Plateau(1));
    		f.setVisible(true);
    		}
    }
    Classe Plateau
    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
     
    import java.awt.Color;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
    import javax.swing.JButton;
    import javax.swing.JPanel;
     
    public class Plateau extends JPanel {
     
    public Plateau(int taille){
    	int ligne = 3;
    	int colonne = 5;
    	if(taille == 1){
    		ligne = 3;
    		colonne = 5;
    	}
    	else{
    		ligne = ligne+2*(taille-1);
    		colonne = 5+4*2*(taille-1);
    	}
     
    	int nbHexa = ligne*colonne;
    	setLayout(new GridBagLayout());
    	GridBagConstraints gbc = new GridBagConstraints();
     
            for(int i=0; i<nbHexa; i++){
    		gbc.gridx = i;
    		gbc.gridy = i;
    		//add(new JButton("test"),gbc);
            add(new Hexagone(), gbc);
     
    	}
     
     
    }
    }

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Vu que le seul code dans tes Hexagone, c'est pour les dessiner, il ont une taille minimum et une taille préférée de 0,0. Ce que respecte le GridBagLayout, en leur donnant exactement un espace de 0x0 pour s'afficher.

    Si tu veux voir tes hexagones, donne leur une taille minimume et preffered raisonnable, que le GridBagLayout sache quoi en faire.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Points : 37
    Points
    37
    Par défaut
    J'ai modifié mon code en conséquence en essayant de donner des dimensions dans la classe Hexagone, toujours rien qui s'affiche.
    De même en essayant la même chose dans ma classe Plateau.

    Voici le code modifié :

    Hexagone
    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
     
     
     
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridBagConstraints;
    import java.awt.GridLayout;
    import java.awt.LayoutManager;
     
    import javax.swing.JPanel;
     
    public class Hexagone extends JPanel{
     
     
     
    	public Hexagone(){
     
     
    		//Dimension xx = new Dimension(10,10); en commentaire car j'ai effectué le dernier test sur le Plateau
    		//this.setPreferredSize(xx);
     
     
     
     
    	}
     
    	public void paintComponent(Graphics g){
    	    int x[] = {20, 30, 50, 60, 50, 30};
    	    int y[] = {40, 20, 20, 40, 60, 60};
     
    	    g.drawPolygon(x, y, 6);
     
     
    	}
     
     
    }
    Plateau
    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
     
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
     
    import javax.swing.JButton;
    import javax.swing.JPanel;
     
     
    public class Plateau extends JPanel {
     
     
    public Plateau(int taille){
    	int ligne = 3;
    	int colonne = 5;
    	if(taille == 1){
    		ligne = 3;
    		colonne = 5;
    	}
    	else{
    		ligne = ligne+2*(taille-1);
    		colonne = 5+4*2*(taille-1);
    	}
     
    	int nbHexa = ligne*colonne;
    	setLayout(new GridBagLayout());
    	GridBagConstraints gbc = new GridBagConstraints();
    	for(int i=0; i<nbHexa; i++){
    		gbc.gridx = i;
    		gbc.gridy = i;
    		//add(new JButton("test"),gbc);
    		Hexagone h = new Hexagone();
    		Dimension xx = new Dimension(10,10);
    		h.setPreferredSize(xx);
                    add(h, gbc);
            }
     
     
    }
     
     
     
     
     
     
    }

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu as donnée à tes hexagones une dimension de 10x10, et tu dessine dans la zone 20~60, soit complètement hors du cadre. T'es pas prêt de voir quelque chose. En plus, toujours définir les couleurs à utiliser pour dessiner.

    Commence par mettre une bordure à tes Hexagones (setBorder) pour être sur qu'ils ont une taille raisonnable. Ensuite, dessine en tenant compte des valeurs de getWidth et getHeight dans paintComponent, histoire de bien dessiner dans le cadre.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Points : 37
    Points
    37
    Par défaut
    Ça fonctionne, merci.

    EDIT :

    Je souhaiterai maintenant générer un plateau de jeu comme l'image suivant ce lien : http://fr.wikipedia.org/wiki/L'Enclos_(jeu)

    Mon problème est qu’actuellement, même si j'arrive à avoir une cohérence dans la disposition des mes Hexagones, je ne parviens pas à maîtriser leurs espacements (dans un premier temps je souhaiterai les collés les uns aux autres).

    Je me concentre actuellement sur l'affichage de l'Hexagone central et ses plus proches voisins, cela donne quelque chose comme ça :
    Nom : Sans titre.png
Affichages : 1043
Taille : 35,4 Ko

    Voici mon code permettant cet affichage :

    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
     
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridBagConstraints;
    import java.awt.GridLayout;
    import java.awt.LayoutManager;
     
    import javax.swing.JPanel;
     
    public class Hexagone extends JPanel{
     
     
     
    	public Hexagone(){
    		Dimension xx = new Dimension(65,65);
    		this.setPreferredSize(xx);
    	}
     
    	public void paintComponent(Graphics g){
    	    int x[] = {20, 30, 50, 60, 50, 30};
    	    int y[] = {40, 20, 20, 40, 60, 60};
     
    	    g.drawPolygon(x, y, 6);
    	    //g.setColor(Color.green);
    	    //g.fillPolygon(x, y, 6);
    	}
    }

    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 jeu_dame;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
     
    import javax.swing.JButton;
    import javax.swing.JPanel;
     
     
    public class Plateau extends JPanel {
     
     
    public Plateau(int taille){
    	int ligne = 3;
    	int colonne = 5;
    	if(taille == 1){
    		ligne = 3;
    		colonne = 5;
    	}
    	else{
    		ligne = ligne+2*(taille-1);
    		colonne = colonne+4*2*(taille-1);
    	}
     
    	int nbHexa = ligne*colonne;
     
    	setLayout(new GridBagLayout());
    	GridBagConstraints gbc = new GridBagConstraints();
     
     
    	gbc.gridheight = 1;
    	for(int i=0;i<ligne;i++){
    		gbc.gridx = i;
    		for(int j=0;j<colonne;j++){
    			gbc.gridy = j;
    			if(((j%2==0)&&(i%2!=0))||((j%2!=0)&&(i%2==0))){
     
    				add(new Hexagone(),gbc);
    			}
     
     
    		}
     
    	}
     
    }
     
    }

    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
     
    import javax.swing.JFrame;
     
    public class Initialisation {
     
    	public static void main(String[] args) {
    		JFrame f = new JFrame();
    		f.setSize(600, 600);
    		f.setLocationRelativeTo(null);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.add(new Plateau(1));
    		f.setVisible(true);
    		}
     
    }
    Je ne parviens pas à comprendre non plus pourquoi lorsque je choisit de générer des JButton par exemple, ces éléments sont bien collés les uns aux autres mais pas avec des objet de type graphiques comme mes hexagones ?

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Tu ne prend pas en compte la taille de l'Hexagone lors que tu le dessine. Ici tes coordonnées relative sont toujours plus grande que 20 ce qui fait que tu dépasse la taille de 10 par 10 que tu t'es fixé.

    Tu devrai ajouter le code suivant pour visualiser les bords qui te son disponible pour ton hexagone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g.setColor(Color.RED);
    g.drawRect(0, 0, this.getSize().width-1, this.getSize().height-1);
    Sachant, que tu ne peux pas superposer deux éléments dans un GridLayout, je pense que tu es bon pour géré toi même la gestion du Layout.
    (Une fois que tu aura compris le GridLayout)

    Cordialement,
    Patrick Kolodziejczyk.
    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.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je crois que pour faire ça, tu part complètement dans la mauvaise direction. Je pourrais te suggérer de créer ton propre LayoutManager qui fait la disposition comme sur l'image wikipedia, mais ça ne ferait que te coincer plus tard:

    Les JComponent sont essentiellement carrés => avec des Hexagones, tu va avoir des soucis quand tu voudra surement, par la suite, ajouter la gestion des évènement souris, puisque les bounding box des hexagones vont inévitablement se supperposer. Tu va avoir aussi des soucis de dessin quand tes hexagone vont déborder l'un sur l'autre.

    Dans ton cas, le plus simple c'est de créer un composant "Plateau" qui se charge de tout dessiner, les cases ne devant plus être des JComponent, mais de simples classes permettant d'avoir leur état (occupé, libre, avec quelle piece, numérotation, etc). Tu peux même ainsi te simplifier la vie et faire bien plus beau en utilisant une image pré-dessinée que tue stockerait par exemple dans une png

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/11/2014, 01h33
  2. problème avec java.awt.Desktop.getDesktop().browse
    Par jmmaugis dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 27/03/2012, 16h58
  3. java.awt.* et java.awt.event.*
    Par allomona dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 11/05/2011, 22h21
  4. Effets indésirables avec java.awt.Robot
    Par LGnord dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/08/2008, 14h34
  5. Réponses: 3
    Dernier message: 19/01/2008, 01h15

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