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 :

JPanel d'un tableau de cercles


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut JPanel d'un tableau de cercles
    Bonjour,
    je voudrais créer un JPanel représentant un "tableau" à deux dimenssions de 9cercles (donc 3 cercles sur 3 cercles).
    Je devrai ensuite afficher ce JPanel dans un JFrame.
    Ca devrait ressembler à ceci:


    Je dois donc bien créer un tableau d'objets représentant des cercles et non 9 cercles indépendants... Je pense le faire avec une boucle for contenant drawOval, mais je ne vois pas comment m'y prendre...

    Merci d'avance.

    edit1: il s'agit d'un bean, je dois avoir un constructeur vide qui crée mon tableau mais je suppose que pour dessiner les cercles je dois d'office redéfinir la méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void paintComponent (Graphics g)
    edit2: pour l'affichage je suppose que le mieux est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setLayout(new GridLayout(3,3))

  2. #2
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut
    tu créés un JPanel et tu lui colle un GridLayout (3, 3) .
    Ensuite tu créés un composant Cercle qui hérite de la classe Canvas.
    là tu redéfinis la méthode paintComponent de ton composant pour dessiner un cercle.
    Enfin, tu ajoutes tes 9 cercles (et non 6), tes 9 composants à ton JPanel.
    Bon, je ne sais pas si j'ai tout compris à ton pb...

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Merci pour ta réponse, en effet j'ai du mal à m'expliquer

    Je donne ici l'exemple d'une grille de 3 cercles sur 3 cercles mais pour code doit rester valable si je veux faire 4cercles sur 10cercles, etc.
    Je dois également pouvoir par la suite modifier les cercles (modifier leur couleur, en colorier certains, etc...) je dois donc pouvoir y accéder.
    Le mieux me semble donc de créer un tableau à 2D et de placer les cercles dedans.

    Mais la façon que je connais pour dessiner un cercle est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
     protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLACK);
            g.drawOval(30,20,40,40);
     }
    Je ne vois pas comment faire dans ce cas ci, étant donné que les cercles qu'on spécifie un axe X et axe Y, et que les cercles ne doivent bien entendu pas se superposer...

    Merci

  4. #4
    Membre éclairé
    Profil pro
    ingenieur
    Inscrit en
    Avril 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur

    Informations forums :
    Inscription : Avril 2002
    Messages : 207
    Par défaut
    OK dans ce cas là créer un composant cercle qui hérite de la classe canvas.
    La classe canvas te permettra de déssiner un cercle !
    tu l'ajoute ensuite à ton Panel.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Cela ne règle pas vraiment mon problème vu que je dois dessiner mon cercle avec paintComponent et non par Canvas...

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Ce que je voudrais donc, c'est créer un nombre disons "indéterminé" de cercles, les placer dans un tableau (ou une ArrayListe, ou autre...) afin de pouvoir par les suite les récupérer et les remplir d'une certaine couleurs, etc.

    Merci d'avance.

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Hum hum, meme pour moi qui suis nul en maths....

    Si tu as un nombre n de formes que tu dois ranger en carre, on peut supposer que le nombre horizontal de formes a mettre sur le cote horizontal du carre est √n (puisque l'aire du carre -cad le nombre de cercles contenus dedans- est √n*√n = n). Code non teste :

    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
    int width = ...
    int height = ...
    int numberOfCircles = ...
    // Cast en int puisqu'il y a toujours un nombre ENTIER de cercles par cote.
    int hCircles= (int)Math.floor(Math.sqrt(numberOfCircles));
    int vCircles= (int)Math.ceil(Math.sqrt(numberOfCircles/hCircles));
    // Verifier que hCircles* vCircles est bien >= numberOfCircles !!!
    double hCellSize = width/(double)hCircles;
    double vCellSize = height/(double)vCircles;
    double radius = (Math.min(hCellSize , vCellSize)-3)/2.0;
    if (radius > 0) {
      Graphics2D g2d = (Graphics2D)g.create();
      g2d.setRenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      try {
        double x = 0;
        double y = 0;
        Ellipse2D.Double ellipse = new Ellipse2D.Double();
        for (int j = 0, index = 0; j < vCircles && index < numberOfCircles  ; j++) {
          for (int i = 0; i < hCircles && index < numberOfCircles  ; i++, index++) {
            x = i*hCellSize+hCellSize/2.0;
            y = j*vCellSize+vCellSize/2.0;
            ellipse.setFrameFromCenter(x, y, x+radius, y+radius);
            g2d.setColor(Color.BLACK);
            g2d.draw(ellipse);
            g2d.drawString(String.valueOf(index), (float)x, (float)y);
          }
        }
      }
      finally {
        g2d.dispose();
      }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Merci pour ta solution, mais elle ne convient pas aux exigences de mon prof...

    Mon idée est la suivante:
    1/Créer une classe Cercle qui est un Bean.
    2/Créer une classe Tableau qui contient plusieurs Cercles qui est aussi un Bean.
    3/Créer une classe Fenetre pour afficher le tout.

    Voici mon code, il vous semble correcte?
    Un des problème est que les taille de la fenêtre n'est pas bonne, je dois l'agrandir avant de voir mes cercles... je pensais que le pack() servait à ca...

    Comment faut il faire pour qu'elle ait automatiquement la bonne taille?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Cercle extends JPanel implements Serializable {
     
        public Cercle(){}  
     
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLACK);
            g.drawOval(10,10,40,40);      
        }
    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
     
    public class Tableau extends JPanel implements Serializable{
        Cercle cer1;
        Cercle cer2;
        Cercle cer3;
        Cercle cer4;
     
        public Tableau(){
            cer1=new Cercle();
            cer2=new Cercle();
            cer3=new Cercle();
            cer4=new Cercle();
     
            setLayout(new GridLayout(2,2));
     
            add(cer1);
            add(cer2);
            add(cer3);
            add(cer4);        
     
        }                
    }
    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
     
    public class Fenetre extends JFrame{
        private Tableau leLab;
        public Fenetre() {    
            super("Texte");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            leLab=new Tableau();       
            add(leLab);
            pack();
        }
     
        public static void main(String[] args) {
            Fenetre fenetre = new Fenetre();
            fenetre.setVisible(true);
        } 
     
    }

  9. #9
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il faut que ta classe Cercle renvoie comme preferredSize la taille de ton cercle. (cf méthodes getPreferredSize/setPreferredSize)

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Je ne vois vraiment pas comment faire celà
    Quelqu'un pourrait m'aider?

    Merci

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par alex2746 Voir le message
    Merci pour ta solution, mais elle ne convient pas aux exigences de mon prof...
    Et visiblement tu n'as pas bien lu le code puisque, meme si vous utilisez un rendu/une disposition differente, je t'ai indique comment ranger tes n cercles dans une forme carree dont la taille du cote depend de n...
    Indice : les parametres cols et rows du GridLayout...

    Sinon tu stockes la taille du cercles dans ton beans et tu surcharges la methode indiquee (getPreferredSize()) de maniere a toujours retourner cette taille.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Merci pour vos réponses, j'ai tenté de regler le problème en réécrivant la classe getPreferedSize(). En ajoutant uniquement ceci à mon code de classe Cercle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        @Override
        public Dimension getPreferredSize(){
            return new Dimension (30,30);
        }
    J'ai également du modifer cette ligne dans paintComponent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g.drawOval(0,0,20,20);
    Mon code semble marcher de cette façon, d'après vous c'est correcte? Je ne dois donc pas écrire la méthode setPreferredSize()?

    Merci d'avance.

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Bonjour, j'ai encore besoin de votre aide afin de pouvoir modifier l'état d'un de mes cercles. J'aimerais qu'en cliquant sur un de me cercle il soit colorié en rouge, et puis que si je reclique dessu il reprend la couleur initiale (disons gris..) et ainsi de suite.

    Je sais qu'avec un JButton il y a ActionListener mais je pense avoir compris que dans le cas de mon cercle (qui est un javabean) il faut le faire d'une autre facon...

    Pouvez vous m'aider?

    Merci d'avance.

  14. #14
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    MouseListener

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

Discussions similaires

  1. [JAVA] - Tableau de JPanels
    Par kronos85 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 04/01/2008, 16h30
  2. Superposition jPanel Cercle
    Par Matt112 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 23/11/2007, 19h16
  3. Insérer un tableau d'objet dans un Jpanel
    Par Flophx dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 25/04/2006, 20h37
  4. Disposition d'un tableau de boutons dans un JPanel
    Par Arnaud F. dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/04/2006, 18h09
  5. [Débutant] Définir un tableau de JPanel
    Par etiennegaloup dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 20/07/2005, 10h22

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