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 :

[Swing]Affichage classe extends JPanel


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Par défaut [Swing]Affichage classe extends JPanel
    Bonjour à tous et merci d'avance à ceux qui prendront le temps de réfléchir à mon problème !

    Celui-ci est surement assez simple mais je n'arrive malheureusement pas à en trouver la solution.

    Je voudrais réaliser une classe "Led" qui étendra JPanel. Cette classe possède un attribut bolléen "allumé" et affiche un cercle dont la couleur dépend de ce parametre.

    La classe principal étend JFrame et insere la classe Led. Malheureusement celle-ci ne s'affiche pas. Voici mon code :

    • La classe Led :
      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 Led extends JPanel{
       
          private Color couleur;
          private boolean allumé;
       
          public Led() {
              allumé = false;
              couleur = Color.GREEN;
          }    
       
          public void paintComponent(Graphics g){
              super.paintComponent(g); 
              if(allumé)
                  g.setColor(couleur);
              else
                  g.setColor(Color.RED);
              g.fillOval(0,0,200,200);
          }
      }
      Cette classe possède aussi des assesseurs non mis par soucis de lisibilité.
    • La classe principale :
      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
       
       
      public class Main extends JFrame{
       
          private LedBean led;
          private JButton bouton;
          private JTextField texte;
       
          public Main() {
              super("Test de led");
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setMinimumSize(new Dimension(400,300));
              setLayout(new FlowLayout());   
       
              bouton = new JButton("Switch");
              led = new LedBean();        
       
              add(bouton);
              add(led);
       
              pack();
          }
       
          public static void main(String[] args) {
              Main main = new Main();
              main.setVisible(true);
          }
       
      }
      Aucun actionListener sur le bouton par soucis de lisibilité.


    Quelques observations :
    - Lorsqu'on ajoute pas le bouton à la frame et qu'on supprime l'instruction setLayout(new FlowLayout()) la led s'affiche. Par contre dés qu'un layout est précisé ce n'est plus le cas..

    Autre question :
    - L'instruction "pack()" n'est-elle pas censée calculer la taille optimale de la fenetre dans le cas ou aucune taille n'a été précisée spécifiquement ? Car dans le cas ou la led s'affiche (voir "quelques observations") la fenetre est au démarrage trop petite que pour la voir...

    J'espère que vous pourrez m'aider..
    Merci d'avance et bonne journée à tous

  2. #2
    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
    1. C'est normal, une JFrame par défault est en BorderLayou, et le add ajoute systématiquement dans l'emplacement CENTER (il faut utiliser la méthode
      add(Component c, String emplacement) ou emplacement vaut une des valeurs BorderLayout.SOUTH/NORTH/CENTER/EAST/WEST
    2. La méthode pack se base sur la preferredSize des composants contenus (elle ne va pas deviner la taille par celle de ton dessin non plus, c'est pas magique). Donc si ton composant n'as pas de prefferedSize elle est fixée à 0.
    ++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Par défaut
    Merci beaucoup pour cette réponse rapide qui m'a permis de solutionner mon probleme !

    Edit :
    Et aussi pour cette deuxième réponse pleine d'explication très intéressante..

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Quentin D
    - Lorsqu'on ajoute pas le bouton à la frame et qu'on supprime l'instruction setLayout(new FlowLayout()) la led s'affiche. Par contre dés qu'un layout est précisé ce n'est plus le cas..
    C'est surtout un problème de taille. La taille d'un composant dépend de ses différentes préférences de taille (preferred, min, max) et du layout utilisé.

    Le layout par défaut des JFrame est un BorderLayout qui place le composant au centre de la fenêtre avec une taille qui occupe la totalité de l'espace disponible sans trop prendre en compte les préférences de taille... Donc ton composant est bien visible.

    Le FlowLayout par contre utilise ces préférences de tailles et ne redimensionne pas le composant. Or la taille d'un JPanel dépend de ses composants fils, et comme ton objet Led n'en as pas ses préférences de taille sont égales à 10x10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            System.out.println("Preferred : " + led.getPreferredSize());
            System.out.println("Minimum   : " + led.getMinimumSize());
            System.out.println("Maximum   : " + led.getMaximumSize());
    donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Preferred : java.awt.Dimension[width=10,height=10]
    Minimum   : java.awt.Dimension[width=10,height=10]
    Maximum   : java.awt.Dimension[width=32767,height=32767]
    Mais comme tu affiches un cercle de rayon de 200 il sort du petit panel de 10x10 et il n'est pas affiché...


    Donc pour moi il y aurait trois petites modifs à faire dans ta classe :
    1. Modifier la méthode paintComponent() afin de dessiner un cercle qui s'adapte à la taille réel du composant :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      g.fillOval(0,0, getWidth(),getHeight());
      Cela permet d'éviter que le composant soit invisible lorsqu'il est plus petit qu'une certaine taille... et en plus cela fait un composant "étirable" !


    2. Définir les préférences de taille de ton composant, c'est à dire au moins redéfinir setPreferredSize() et pourquoi pas setMinimumSize() :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
          public Led() {
              allumé = false;
              couleur = Color.GREEN;
              setMinimumSize(new Dimension(25,25));
              setPreferredSize(new Dimension(200,200));
          }
    3. Hérité de JComponent plutôt que de JPanel c'est plus logique ta Led est un composant simple qui n'est pas vraiment destiné à recevoir d'autre composant...


    Citation Envoyé par Quentin D
    - L'instruction "pack()" n'est-elle pas censée calculer la taille optimale de la fenetre dans le cas ou aucune taille n'a été précisée spécifiquement ? Car dans le cas ou la led s'affiche (voir "quelques observations") la fenetre est au démarrage trop petite que pour la voir...
    pack() est censé calculer la taille de la fenêtre par rapport à la tailles des composants qu'elle contient. Si les composant qu'elle contient sont minuscule la fenêtre sera minuscule...


    a++

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

Discussions similaires

  1. pb avec une classe extends JPanel
    Par thecancre dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 11/05/2006, 18h45
  2. [AS2] durée de vie d'une classe (extends movieclip)
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 23/07/2005, 13h33
  3. [SWING]affichage d'une image
    Par chico_du_33 dans le forum AWT/Swing
    Réponses: 51
    Dernier message: 08/07/2005, 09h55
  4. sous-classe de JPanel ou de JSpinner ?
    Par etiennegaloup dans le forum Composants
    Réponses: 3
    Dernier message: 06/03/2005, 18h55
  5. [Swing]Affichage d'un lien
    Par Crazyblinkgirl dans le forum 2D
    Réponses: 2
    Dernier message: 26/08/2004, 16h41

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