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 :

Utiliser les layouts pour bien placer les composants Swing ?


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut Utiliser les layouts pour bien placer les composants Swing ?
    Bonjour

    Je suis entrain d'apprendre la manipulation des layouts, pour cela j'ai voulu simuler l'interface suivante (ci-jointe) sans utiliser l'option "Drag and Drop", mais j'arrive pas à préciser les layouts adéquats à utiliser pour bien réaliser cette interface.

    Vos idées m’intéresse beaucoup.




    Merci d'avance.
    Images attachées Images attachées  

  2. #2
    Membre confirmé
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Points : 646
    Points
    646
    Par défaut
    Bonsoir
    Pour ton interface, une solution possible serait d'utiliser ce jeu d'instructions pour positionner tes composants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JTextField text= new JTextField();
    text.setBounds(80, 10, 50, 50);
    panel.setLayout(null);
    panel.add(text);

    ligne 2: permet de positionner ton JTextField aux coordonnées (80, 10), sa dimension est de (width=50, height=50)
    ligne 3: mettre à null le layout du panel
    ligne 4: ajouter ton JTextField à ton panel

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    Bonjour,
    Je me lance avec une proposition d'utilisation des Layout. J'attends les critiques

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    import javax.swing.*;
    import java.awt.*;
     
    public class TestLayout extends JFrame {
     
    	Font font = new Font("Monospaced",Font.PLAIN,12);//changement de font si besoin
     
    	public TestLayout() {
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setLayout(new FlowLayout(FlowLayout.CENTER,20,20)); //pour inserer un panel au centre avec 20 pixels de margin H et V
     
     
    		JPanel panel = new JPanel(new BorderLayout(10,20)); //panel principal à inserer 10 pour espacer entre WEST et CENTER, 20 pour espacer entre CENTER et SOUTH
    		panel.setPreferredSize(new Dimension(340,150));// taille preferee du panel principal
    		add(panel);
     
     
     
    		/****creation des éléments****/
     
    		JLabel labelPrenom = new JLabel("Prenom");
    		labelPrenom.setFont(font);
     
    		JLabel labelNom = new JLabel("Nom");
    		labelNom.setFont(font);
     
    		JLabel labelSexe = new JLabel("Sexe");
    		labelSexe.setFont(font);
     
    		JLabel labelDate = new JLabel("Date");
    		labelDate.setFont(font);
     
    		JPanel panelTextPrenom = new JPanel(new FlowLayout(FlowLayout.LEFT,0,0));//on mets textPrenom dans un JPanel avec LEFT pour coller à gauche et preferredSize fonctionne
    		JTextField textPrenom = new JTextField();
    		textPrenom.setPreferredSize(new Dimension(250,20));//taille de textPrenom
    		textPrenom.setFont(font);
    		panelTextPrenom.add(textPrenom);
     
    		JPanel panelTextNom = new JPanel(new FlowLayout(FlowLayout.LEFT,0,0));//pareil qu'au dessus
    		JTextField textNom = new JTextField();
    		textNom.setPreferredSize(new Dimension(200,20));
    		textNom.setFont(font);
    		panelTextNom.add(textNom);
     
    		JRadioButton radioMasculin = new JRadioButton("Masculin");
    		radioMasculin.setFont(font);
     
    		JRadioButton radioFeminin = new JRadioButton("Feminin");
    		radioFeminin.setFont(font);
     
    		JPanel panelRadio = new JPanel(new FlowLayout(FlowLayout.LEFT,0,0));//on mets les radio dans un JPanel avec LEFT pour coller à gauche
    		panelRadio.add(radioMasculin);
    		panelRadio.add(radioFeminin);
     
    		JComboBox comboJour = new JComboBox();
    		comboJour.setFont(font);
    		for(int i=1;i<32;i++)
    			comboJour.addItem(i);
     
    		JComboBox comboMois = new JComboBox();
    		comboMois.setFont(font);
    		comboMois.addItem("Janvier");
    		comboMois.addItem("Fevrier");
    		comboMois.addItem("Mars");
    		comboMois.addItem("Avril");
    		comboMois.addItem("Mai");
    		comboMois.addItem("Juin");
    		comboMois.addItem("Juillet");
    		comboMois.addItem("Aout");
    		comboMois.addItem("Septembre");
    		comboMois.addItem("Octobre");
    		comboMois.addItem("Novembre");
    		comboMois.addItem("Decembre");
     
    		JComboBox comboAnnee = new JComboBox();
    		comboAnnee.setFont(font);
    		for(int i=1970;i<2014;i++)
    			comboAnnee.addItem(i);
     
    		JPanel panelCombo = new JPanel(new FlowLayout(FlowLayout.LEFT,0,0));//on mets les combo dans un JPanel avec LEFT pour coller à gauche
    		panelCombo.add(comboJour);
    		panelCombo.add(comboMois);
    		panelCombo.add(comboAnnee);
     
    		/****fin de la création des éléments****/
     
     
    		JPanel panelWest = new JPanel(new GridLayout(4,1));//panelWest à l'ouest du borderlayout. c'est une grille d'une colonne avec 4 lignes pour les labels
    		panelWest.add(labelPrenom);
    		panelWest.add(labelNom);
    		panelWest.add(labelSexe);
    		panelWest.add(labelDate);
    		panel.add(panelWest,BorderLayout.WEST);//ajout du panelWest au panel principal
     
     
     
    		JPanel panelCentre = new JPanel(new GridLayout(4,1));//panelCentre au centre du borderlayout. c'est une grille d'une colonne avec 4 lignes
    		panelCentre.add(panelTextPrenom);
    		panelCentre.add(panelTextNom);
    		panelCentre.add(panelRadio);
    		panelCentre.add(panelCombo);
    		panel.add(panelCentre,BorderLayout.CENTER);//ajout du panelCentre au panel principal
     
    		JPanel panelSouth = new JPanel(new FlowLayout(FlowLayout.CENTER,60,0));//panel sud pour les 2 boutons, 60 pixels entre chaque
    		JButton boutonEnregistrer = new JButton("Enregistrer");
    		JButton boutonAnnuler = new JButton("Annuler");
    		panelSouth.add(boutonEnregistrer);
    		panelSouth.add(boutonAnnuler);
    		panel.add(panelSouth,BorderLayout.SOUTH);//ajout du panelSouth au panel principal
     
    		pack();//java propose la meilleure taille en fonction des elements
    		setVisible(true);
    	}
     
     
     
     
    	public static void main(String[] args) {
    		TestLayout t = new TestLayout();
    	}
    }

  4. #4
    Membre confirmé
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Points : 646
    Points
    646
    Par défaut
    ludomacho, je n'crois pas qu'il y'aura de critiques mais plutot un grand merci de sa part

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    @ludomacho
    Grand merci à vous, c'est exactement ce que je veux.

    Sinon, pour la méthode de setBounds :
    ça marche bien, si je place les composantes dans le ContentPane directement .. mais ça marche pas lorsque je mets un JPanel au-dessus de ContentPane et je place les composantes sur le JPanel. Exemple :

    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
    import java.awt.BorderLayout;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class Test extends JFrame {
     
        public Test() {
            setSize(400, 400);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            Container c = this.getContentPane();
            c.setLayout(new BorderLayout());
            JPanel pan = new JPanel(null);
            JTextField test = new JTextField("C'est juste un test ..");
            pan.add(test);
            test.setBounds(30, 50, 100, 30);
            c.add(pan, BorderLayout.NORTH);
        }
     
        public static void main(String args[]) {
            new Test().setVisible(true);
        }
    }
    Ou est le problème ,à votre avis ?

  6. #6
    Membre confirmé
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Points : 646
    Points
    646
    Par défaut
    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 Test extends JFrame {
     
    	    public Test() {
    	        setSize(400, 400);
    	        setDefaultCloseOperation(EXIT_ON_CLOSE);
     
    	        JPanel pan = new JPanel();
    	        pan.setLayout(null);
     
    	        JTextField test = new JTextField("C'est juste un test ..");
    	        test.setBounds(30, 50, 100, 30);
     
    	        pan.add(test);
     
    	        this.getContentPane().add(pan);
                    // même avec this.setContentPane(pan); ça marche
    	    }
     
    	    public static void main(String args[]) {
    	        new Test().setVisible(true);
    	    }
    	}
    Voila comme ça, ça marche

    Tu dois annuler le Layout du container dans lequel tu vas entreposer tes composant, à savoir "pan"

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    Donc je ne peux pas trouver une ContentPane (dont le layout n'est pas null) contenant un JPanel de layout null ?

  8. #8
    Membre confirmé
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Points : 646
    Points
    646
    Par défaut
    Citation Envoyé par khaled_prg Voir le message
    Donc je ne peux pas trouver une ContentPane (dont le layout n'est pas null) contenant un JPanel de layout null ?
    Heu je n'ai pas bien saisi ta question là ?
    Le JPanel "pan" a bien son layout à null et il est contenu dans une frame (this.getContentPane().add(pan) avec son layout par défaut

    Chaque container a un Layout par défaut qui te permet de disposer tes composants dans un ordre précis et définit selon le layout Mais si tu veux utiliser les coordonnées, tu dois enlever tout layout

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    Alors pourquoi ce code ne fonctionne pas (la zone du texte n'apparait pas !) ?

    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
    import java.awt.BorderLayout;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class Test extends JFrame {
     
        public Test() {
            setSize(400, 400);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            Container c = this.getContentPane();
            c.setLayout(new BorderLayout());
            JPanel pan = new JPanel();
            pan.setLayout(null);
            JTextField test = new JTextField("C'est juste un test ..");
            pan.add(test);
            test.setBounds(30, 50, 100, 30);
            c.add(pan, BorderLayout.NORTH);
        }
     
        public static void main(String args[]) {
            new Test().setVisible(true);
        }
    }

  10. #10
    Membre confirmé
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Points : 646
    Points
    646
    Par défaut
    avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.add(pan, BorderLayout.CENTER);
    ton code marche

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    mais pourquoi ça marche avec CENTER et ça ne marche pas avec NORTH ? :/

  12. #12
    Membre confirmé
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Points : 646
    Points
    646
    Par défaut
    Le pan va remplir le container de la JFrame étant donné qu'il est le seul élément et que sa dimension n'a pas été explicitement déterminée

    Par exemple si tu fais

    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 Test extends JFrame {
     
        public Test() {
            setSize(400, 400);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            Container c = this.getContentPane();
            c.setLayout(new BorderLayout());
            JPanel pan = new JPanel();
            pan.setPreferredSize(new Dimension(200, 200));
            pan.setLayout(null);
            JTextField test = new JTextField("C'est juste un test ..");
            pan.add(test);
            test.setBounds(30, 50, 100, 30);
            c.add(pan, BorderLayout.NORTH);
        }
     
        public static void main(String args[]) {
            new Test().setVisible(true);
        }
    }
    En précisant la taille de ton pan avec pan.setPreferredSize(new Dimension(200, 200)); alors c.add(pan, BorderLayout.NORTH); fonctionne.

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    @Laine
    +1

    J'ai bien compris ce que vous avez dit.
    Merci.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    L'utilisation d'un layout null est une pratique totalement déconseillée.

    Verbeuse, difficilement maintenable, chiante pour gérer le redimensionnement, les scroll panes.
    Et, de plus, impossible de savoir ce que ça va donner avec tel ou tel look and feel, tel ou tel système, les polices, marges & cie variant de l'un à l'autre.
    A éviter comme la peste.

    Pour ce genre de choses, je recommanderais plutôt du GridBagLayout, du FormLayout, du MigLayout, du GroupLayout via l'éditeur de netbeans ou ce genre de layouts avancés et flexibles.

  15. #15
    Membre confirmé
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Points : 646
    Points
    646
    Par défaut
    Citation Envoyé par sinok Voir le message
    L'utilisation d'un layout null est une pratique totalement déconseillée.

    Verbeuse, difficilement maintenable, chiante pour gérer le redimensionnement, les scroll panes.
    Et, de plus, impossible de savoir ce que ça va donner avec tel ou tel look and feel, tel ou tel système, les polices, marges & cie variant de l'un à l'autre.
    A éviter comme la peste.

    Pour ce genre de choses, je recommanderais plutôt du GridBagLayout, du FormLayout, du MigLayout, du GroupLayout via l'éditeur de netbeans ou ce genre de layouts avancés et flexibles.
    Ah je ne le savais pas
    Je n'ai pas l'habitude de l'utiliser mais pour son interface ça me paraissant faisable puisque c'est une simple fenêtre qui n'est pas destinée à être redimensionnée.

    Merci pour la mise au point.

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

Discussions similaires

  1. [Java 6] où placer les .jar pour imports?
    Par Jean_Benoit dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 30/01/2009, 10h07
  2. Réponses: 4
    Dernier message: 28/12/2008, 01h07
  3. Les cléfs pour bien débuter le webmastering
    Par abakobo dans le forum Débuter
    Réponses: 1
    Dernier message: 13/12/2007, 16h43
  4. Conseils pour bien écrire les classes ado.net
    Par azerty53 dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/05/2007, 17h24

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