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

Agents de placement/Fenêtres Java Discussion :

Guide des différents agents de placement (Layout)


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Rédacteur

    Avatar de Mickael Baron
    Homme Profil pro
    Ingénieur de Recherche en Informatique
    Inscrit en
    Juillet 2005
    Messages
    14 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche en Informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14 974
    Points : 73 024
    Points
    73 024
    Par défaut Guide des différents agents de placement (Layout)
    Une question qui revient souvent sur ce forum concerne la mise en page des composants graphiques au sein d'une application SWING / AWT.

    Je propose d'utiliser ce sujet pour référencer tous les layouts qui peuvent sembler utiles aux applications graphiques AWT / SWING.

    Si vous en connaissez qui ne sont pas dans la liste, merci de laisser des liens vers :

    • une explication de son fonctionnement ;
    • la librairie (.jar) contenant la classe à utiliser ;
    • éventuellement une capture d'écran.

    Vous pouvez aussi mettre un résumé des avantages / inconvénients de ce layout.

    PS1 : j'éditerai mon post au fur et à mesure
    PS2 : je ne sais pas si il y en a, mais si un layout est payant, merci de le préciser
    PS3 : si vous avez des questions ou des problèmes concernant un layout, merci de créer un nouveau sujet.

    Les layouts compris dans le jdk :


    • BorderLayout [image] : place les composants en indiquant simplement leur emplacementde la façon NORD, SUD, EST, OUEST, CENTRE (layout par défaut des composants SWING)


    • BoxLayout [image] : aligne les composants sur un axe vertical ou horizontal.


    • CardLayout [image1 | image2] : superpose plusieurs jpanels et affiche celui désiré. Permet l'implémentation d'une interface à onglets.


    • FlowLayout [image] : place les composants à la suite sur une ligne, puis sur une autre ligne si le conteneur n'est pas assez large.


    • GridBagLayout [image] : place les composants dans un tableau de cellules de tailles variables. (très flexibles et puissants mais plutôt complexes à appréhender)


    • GridLayout [image] : place les composants dans un tableau de cellules de tailles identiques.


    • GroupLayout [image] : développé à l'origine pour les GUI builder (générateurs d'interface comme Matisse ou Visual Editor). Ce layout utilise 2 groupes correspondant à chaque dimension (verticale et horizontale), donc chaque composant doit être ajouté 2 fois pour définir sa place verticale et horizontale.


    • SpringLayout [image1 | image2] : développé à l'origine pour les GUI builder (générateurs d'interface comme Matisse ou Visual Editor), permet de spécifier des relations/distances entre les différents composants.


    Autres layouts :









    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Ingénieur de Recherche en informatique au LIAS / ISAE-ENSMA
    Page de Developpez.com : mbaron.developpez.com
    Twitter : www.twitter.com/mickaelbaron
    Blog : mickael-baron.fr
    LinkedIn : www.linkedin.com/in/mickaelbaron
    DBLP : dblp.uni-trier.de/pers/hd/b/Baron:Micka=euml=l

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 140
    Points
    140
    Par défaut
    Je trouve ça excellent
    Des infos en français, ça fait toujours plaisir

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    merci morph d avoir référencé les layouts!!!


    beau boulot!! aux débutants comme moi ca facilite beaucoup le travail d apprentissage quand il y a et les liens et l apercu graphique!!

    encore merci!!!

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Points : 31
    Points
    31
    Par défaut
    Pas mal, je l'ajoute dans les favoris, ça m'évitera de me tirer les cheveux avec des composants qui vole dans tous les coins

    ++

  6. #6
    Membre confirmé Avatar de javaNavCha
    Homme Profil pro
    EKG Group
    Inscrit en
    Juillet 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : EKG Group
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 311
    Points : 631
    Points
    631
    Par défaut
    salut,
    moi j'utilise setLayout(null) et je positionne moi même mes composants avec setBounds(,,,) il ya quelque inconvénient mais ça marche...
    On essaie
    et ça marchera

    Mon site
    Ma page

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par javacha4 Voir le message
    salut,
    moi j'utilise setLayout(null) et je positionne moi même mes composants avec setBounds(,,,) il ya quelque inconvénient mais ça marche...
    C'est une des worst practice en swing. Par exemple, comment fais tu quand tu veux que ton interface redimentionnée en fonction de la taille de la fenêtre?
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    comment fais tu quand tu veux que ton interfacese redimentionne en fonction de la taille de la fenêtre?
    Apparemment c'est le seul argument contre le layout null...
    (je suis toujours plein-écran, et je positionne mes composants en % des dimensions de l'écran; fini les crises de nerfs).

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Points : 268
    Points
    268
    Par défaut
    Je pense qu'une fois les layouts maitrisés, on peut créer des fenêtres plus rapidement et de façon plus esthétiques.
    Personnellement, j'utilise que le borderlayout, flowlayout, boxlayout et gridlayout et pour le moment ça m'a permi de réaliser toutes mes fenêtres.

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fraco Voir le message
    Apparemment c'est le seul argument contre le layout null...
    Non ce n'est pas le seul argument.
    En plus du redimensionnement impossible (ou très complexe à mettre en oeuvre), cela amène d'autres désavantages qui peuvent nuire à la portabilité/compatibilité de l'appli :
    • Obligation de positionner et dimensionner tous les composants, ce qui rend le code plus difficile à maintenir.
    • Dépendant des préférences utilisateurs du système (le choix d'une grande police peut tout casser).
    • Dépendant du LookAndFeel utilisé, en cas de changement des caractéristiques de ses composants.
    • Dépendant de la version de Java, en cas de changement dans le LookAndFeel.



    Bien choisi, un LayoutManager est non seulement plus simple à utiliser, mais il offre bien plus de souplesse...


    a++

  11. #11
    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
    Citation Envoyé par fraco Voir le message
    Apparemment c'est le seul argument contre le layout null...
    (je suis toujours plein-écran, et je positionne mes composants en % des dimensions de l'écran; fini les crises de nerfs).
    En gros tu fais le boulot du layoutmanager... Ce qui te pose probleme c'est pas de devoir utiliser un layout pour positionner tes éléments, c'est le fait qu'aucun layout existant ne positionne "comme tu le veux".

    Franchement, si c'est pour positionner toi même avec des calculs en % et fonction éventuellement des preferredSize de tes composant -> Met ces règles dans un layout custom et tu sera tranquille, propre et redimensionnable Pour pas plus de boulot!

    Pour rappel: aucune règle n'impose d'utiliser les layout de base de Swing. chaque fois que je vois quelqu'un mettre un setLayout(null), il refait un layout lui même sauf qu'il le met pas dans un classe layout (bref on brise le principe pour faire exactement ce pour quoi le principe est prévu).

  12. #12
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Merci à tous !
    voilà des pistes intéressantes...

  13. #13
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Un Layout qui place les composants où je veux dans le conteneur (position et grandeur en % du conteneur)...
    largeur ou hauteur < 0 : laisser au composant ses dimensions
    > 0 : imposer de nouvelles dimensions
    Qu'en pensez-vous ?

    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
        public class LayoutPourCent implements LayoutManager {
          private ArrayList<Integer>   lesX = new ArrayList();
          private ArrayList<Integer>   lesY = new ArrayList();
          private ArrayList<Integer>   lesL = new ArrayList();
          private ArrayList<Integer>   lesH = new ArrayList();
          private ArrayList<Component> lesC = new ArrayList();
     
          public LayoutPourCent (){
          }
          public void addNouveau(int x, int y ,int l, int h, Component c){
              lesX.add(x);
              lesY.add(y);
              lesL.add(l);
              lesH.add(h);
              lesC.add(c);
          }
          public void addLayoutComponent(String name,Component comp){
          }
          public  void layoutContainer(Container parent){
              int x, y, l, h;
              for (int i = 0; i < lesX.size(); i++){
                  x = (int)(((parent.getWidth()) *(lesX.get(i)) / 100));
                  y = (int)(((parent.getHeight())*(lesY.get(i)) / 100));
                  l = (int)(((parent.getWidth()) *(lesL.get(i)) / 100));  // largeur
                  h = (int)(((parent.getHeight())*(lesH.get(i)) / 100));  // hauteur
                  Component c = lesC.get(i);
                  if ((l < 0) || (h < 0)) c.setLocation(x,y);        // garder largeur et hauteur du composant
                  else                    c.setBounds(x, y, l, h);   // imposer largeur et hauteur
              }
          }
          public Dimension minimumLayoutSize(Container parent) {
              return new Dimension(0,0);
          }
          public Dimension preferredLayoutSize(Container parent){
              return new Dimension(0,0);
          }
          public void removeLayoutComponent(Component comp) {
          }
        }
    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            setLayout(new BorderLayout(2,2));
            add(jPanel1, BorderLayout.CENTER);
            LayoutPourCent lpc = new LayoutPourCent();
            jPanel1.setLayout(lpc);
            lpc.addNouveau(15, 20, -1, -1, jButton1);     jPanel1.add(jButton1);
            lpc.addNouveau(30, 70, -1, -1, jTextField1);  jPanel1.add(jTextField1);
            lpc.addNouveau(50, 20, 40, 20, jScrollPane1); jPanel1.add(jScrollPane1);  // contient la table
            lpc.addNouveau(10, 34, 30, 20, jPanel2);      jPanel1.add(jPanel2);

  14. #14
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Encore mieux, précision jusqu'au pixel si nécessaire :

    Un Layout qui place les composants où je veux dans le conteneur (position et grandeur en proportion du conteneur)...
    largeur ou hauteur < 0 : laisser au composant ses dimensions
    largeur ou hauteur > 0 : imposer de nouvelles dimensions;
    si deux composants se chavauchent, le premier placé sera devant.

    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
    public class LayoutPourCent implements LayoutManager {
          private ArrayList<Double>   lesX = new ArrayList();
          private ArrayList<Double>   lesY = new ArrayList();
          private ArrayList<Double>   lesL = new ArrayList();
          private ArrayList<Double>   lesH = new ArrayList();
          private ArrayList<Component> lesC = new ArrayList();
     
          public LayoutPourCent (){
          }
          public void placer(Double x, Double y, Double l, Double h, Component c){
              lesX.add(x);
              lesY.add(y);
              lesL.add(l);
              lesH.add(h);
              lesC.add(c);
          }
          public void addLayoutComponent(String name,Component comp){
          }
          public  void layoutContainer(Container parent){
              int x, y, l, h;
              for (int i = 0; i < lesX.size(); i++){
                  x = (int)(((parent.getWidth()) *(lesX.get(i))));
                  y = (int)(((parent.getHeight())*(lesY.get(i))));
                  l = (int)(((parent.getWidth()) *(lesL.get(i))));  // largeur
                  h = (int)(((parent.getHeight())*(lesH.get(i))));  // hauteur
                  Component c = lesC.get(i);
                  if ((l < 0) || (h < 0)) c.setLocation(x,y);        // garder largeur et hauteur du composant
                  else                    c.setBounds(x, y, l, h);   // imposer largeur et hauteur
              }
          }
          public Dimension minimumLayoutSize(Container parent) {
              return new Dimension(0,0);
          }
          public Dimension preferredLayoutSize(Container parent){
              return new Dimension(0,0);
          }
          public void removeLayoutComponent(Component comp) {
          }
      }

    utilisation : (ici on place un panel, jPanelHaut1 en haut de jPanel1, et un combo, jComboBoxTri auquel on laisse les hauteur et largeur originales )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       LayoutPourCent lpc = new LayoutPourCent();
       jPanel1.setLayout(lpc);
       lpc.placer( 0.01, 0.005, 0.985, 0.07, jPanelHaut1);    jPanel1.add(jPanelHaut1);
       lpc.placer( 0.85, 0.25, -0.1, -0.1, jComboBoxTri); jPanelHaut1.add(jComboBoxTri);
    jPanelHaut1 est placé à un centième du bord gauche de jPanel1, à cinq millièmes du haut de jPanel1, sa largeur sera de 985 millièmes de celle de jPanel1, sa hauteur de sept centièmes de celle de jPanel1.

  15. #15
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Une précision au pixel près, c'est complètement illusoire... En plus ça prend plein de temps à faire...

    Le GridBagLayout c'est la base, dedans on met d'autres layouts et on peut ainsi définir une série de layouts standard, sans s'occuper à chaque fenêtre de l'emplacement des composants. Dès qu'on fait un truc répétitif, c'est que c'est automatisable...
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  16. #16
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Chacun sa préférence...
    Je me base sur la recommandation de tchize_ (message du 10.12.2010 ci-dessus) :

    Met ces règles dans un layout custom et tu sera tranquille, propre et redimensionnable Pour pas plus de boulot!
    Voilà.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Il manque le ScrollPaneLayout non?

    http://docs.oracle.com/javase/1.4.2/...aneLayout.html

    C'est le layout spécifique au scrollpane.

Discussions similaires

  1. [UIManager] Liste des différentes propriétés
    Par sinok dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 23/05/2006, 02h17
  2. [Sauvegarde en ligne]Quelles solutions des différents SGBD?
    Par exclusif dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 03/04/2006, 18h25
  3. Théories formelles des différents langages. Où ça ?
    Par HanLee dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 24/02/2006, 20h16
  4. guide des NURBS
    Par MrDuChnok dans le forum OpenGL
    Réponses: 7
    Dernier message: 10/01/2003, 14h29

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