# Java > Interfaces Graphiques en Java > AWT/Swing >  [Swing]Affichage classe extends JPanel

## Quentin D

Bonjour  tous et merci d'avance  ceux qui prendront le temps de rflchir  mon problme !

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

Je voudrais raliser une classe "Led" qui tendra JPanel. Cette classe possde un attribut bollen "allum" et affiche un cercle dont la couleur dpend 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 :


```

```

Cette classe possde aussi des assesseurs non mis par soucis de lisibilit. La classe principale :


```

```

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 ds qu'un layout est prcis ce n'est plus le cas.. 

Autre question :
- L'instruction "pack()" n'est-elle pas cense calculer la taille optimale de la fenetre dans le cas ou aucune taille n'a t prcise spcifiquement ? Car dans le cas ou la led s'affiche (voir "quelques observations") la fenetre est au dmarrage trop petite que pour la voir...

J'espre que vous pourrez m'aider..
Merci d'avance et bonne journe  tous  ::P:

----------


## sinok

C'est normal, une JFrame par dfault est en BorderLayou, et le add ajoute systmatiquement dans l'emplacement CENTER (il faut utiliser la mthode 
add(Component c, String emplacement) ou emplacement vaut une des valeurs BorderLayout.SOUTH/NORTH/CENTER/EAST/WESTLa mthode 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 fixe  0.++

----------


## adiGuba

Salut,




> - Lorsqu'on ajoute pas le bouton  la frame et qu'on supprime l'instruction setLayout(new FlowLayout()) la led s'affiche. Par contre ds qu'un layout est prcis ce n'est plus le cas..


C'est surtout un problme de taille. La taille d'un composant dpend de ses diffrentes prfrences de taille (preferred, min, max) et du layout utilis.

Le layout par dfaut des JFrame est un BorderLayout qui place le composant au centre de la fentre avec une taille qui occupe la totalit de l'espace disponible sans trop prendre en compte les prfrences de taille... Donc ton composant est bien visible.

Le FlowLayout par contre utilise ces prfrences de tailles et ne redimensionne pas le composant. Or la taille d'un JPanel dpend de ses composants fils, et comme ton objet Led n'en as pas ses prfrences de taille sont gales  10x10 :


```

```

donnera :


```

```

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 :
Modifier la mthode *paintComponent()* afin de dessiner un cercle qui s'adapte  la taille rel du composant :


```
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" !

Dfinir les prfrences de taille de ton composant, c'est  dire au moins redfinir *setPreferredSize()* et pourquoi pas *setMinimumSize()* :


```

```

Hrit de *JComponent* plutt que de *JPanel*  ::arrow::  c'est plus logique ta Led est un composant simple qui n'est pas vraiment destin  recevoir d'autre composant...




> - L'instruction "pack()" n'est-elle pas cense calculer la taille optimale de la fenetre dans le cas ou aucune taille n'a t prcise spcifiquement ? Car dans le cas ou la led s'affiche (voir "quelques observations") la fenetre est au dmarrage trop petite que pour la voir...


*pack()* est cens calculer la taille de la fentre par rapport  la tailles des composants qu'elle contient. Si les composant qu'elle contient sont minuscule la fentre sera minuscule...


a++

----------


## Quentin D

Merci beaucoup pour cette rponse rapide qui m'a permis de solutionner mon probleme !

Edit :
Et aussi pour cette deuxime rponse pleine d'explication trs intressante..

----------

