Partage
  • Partager sur Facebook
  • Partager sur Twitter

Espace entre les Composants d'un GroupLayout

Sujet résolu
    17 janvier 2020 à 14:47:40

    Salut,

    A l'execution de mon programme j'ai cette fenetre:

    Je voudrais qu'il y'ait un espace entre les differents Jtextfield, Jcombox, etc, qui sont tous dans un meme GroupLayout.

    Voici le code

    package fenetre;
    
    //	Les imports....
    
    /**
     *
     * @author Asmitta
     */
    public class Fenetre extends JFrame{
        private final JPanel c = new JPanel();
        //  Differents label a utiliser
        private JLabel panMatricule = new JLabel("Matricule :  ");
        private JLabel panNom = new JLabel("Nom :  ");
        private JLabel panPrenom = new JLabel("Prenom :  ");
        private JLabel panTel = new JLabel("Telephone : ");
        private JLabel panFiliere = new JLabel("Filiere : ");
        private JLabel panCycl = new JLabel("Cycle : ");
        //  Ensuite les champs de texte, boutons et radio qui y seront liés....
        private JFormattedTextField Matricule;
        private JFormattedTextField Nom;
        private JFormattedTextField Prenom;
        private JFormattedTextField Telephone;
        private JComboBox filiere;
        private JRadioButton jr1 = new JRadioButton("Licence");
        private JRadioButton jr2 = new JRadioButton("Master");
        private ButtonGroup grpB = new ButtonGroup();
        private Bouton bouton = new Bouton("Enregistrer");
        
        public String[] listFil = {"Informatique", "Mathematiques", "Chimie", "Biochimie", "Physique"};
        
        public Fenetre() throws ParseException{
            // Creation d'une Fenetre
            super("Enregistrement des Donnees de l'Etudiant");
            //  Initialisation des composants...
            this.Matricule = new JFormattedTextField(new MaskFormatter("##S#####"));    // '#' c'est pour que ça n'accepte qu'un chiffre a cet endroit...
            this.Nom = new JFormattedTextField(new MaskFormatter("**********************************"));
            this.Prenom = new JFormattedTextField(new MaskFormatter("**********************************"));
            this.Telephone = new JFormattedTextField(new MaskFormatter("# ## ## ## ##"));
            this.filiere = new JComboBox(listFil);
            //  Definition des bordures de Label pour les espacer, etant dans GroupLayout(), ils seraient tous collés sans ça
            panMatricule.setBorder(new EmptyBorder(10, 8, 10, 8)); 
            panNom.setBorder(new EmptyBorder(10, 8, 10, 8));
            panPrenom.setBorder(new EmptyBorder(10, 8, 10, 8)); 
            panTel.setBorder(new EmptyBorder(10, 8, 10, 8)); 
            panFiliere.setBorder(new EmptyBorder(10, 8, 10, 8)); 
            panCycl.setBorder(new EmptyBorder(10, 8, 10, 8)); 
            //  Ici, on definit la taille et la police des differents champs...
            Matricule.setFont(new Font("Calibri", Font.TRUETYPE_FONT, 15));
            Nom.setFont(new Font("Calibri", Font.TRUETYPE_FONT, 15));
            Prenom.setFont(new Font("Calibri", Font.TRUETYPE_FONT, 15));
            Telephone.setFont(new Font("Calibri", Font.TRUETYPE_FONT, 15));
            filiere.setFont(new Font("Calibri", Font.PLAIN, 15));
            jr1.setPreferredSize(new Dimension(100, 35));
            jr2.setPreferredSize(new Dimension(100, 35));
            grpB.add(jr1);
            grpB.add(jr2);
            bouton.setFont(new Font("Calibri", Font.PLAIN, 15));
            
            c.setFont(new Font("Calibri", Font.PLAIN, 15));
            GroupLayout groupe = new GroupLayout(c);
            c.setLayout(groupe);
            c.setBorder(new EmptyBorder(5, 9, 5, 15));
            
            GroupLayout.SequentialGroup horzGroupe = groupe.createSequentialGroup();     
            GroupLayout.ParallelGroup vertGroupe = groupe.createBaselineGroup(false, false);
            horzGroupe.addGroup(groupe.createParallelGroup().addComponent(panMatricule).addComponent(panNom).addComponent(panPrenom).addComponent(panTel).addComponent(panFiliere).addComponent(panCycl));  
            horzGroupe.addGroup(groupe.createParallelGroup().addComponent(Matricule).addComponent(Nom).addComponent(Prenom).addComponent(Telephone).addComponent(filiere).addComponent(jr1).addComponent(jr2));  
            vertGroupe.addGroup(groupe.createSequentialGroup().addComponent(panMatricule).addComponent(panNom).addComponent(panPrenom).addComponent(panTel).addComponent(panFiliere).addComponent(panCycl));  
            vertGroupe.addGroup(groupe.createSequentialGroup().addComponent(Matricule).addComponent(Nom).addComponent(Prenom).addComponent(Telephone).addComponent(filiere).addComponent(jr1).addComponent(jr2));  
            groupe.setHorizontalGroup(horzGroupe);
            groupe.setVerticalGroup(vertGroupe);      
        }
        
        public void affichage(){
            this.setContentPane(c);
            this.setSize(280, 275);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        /**
         * @param args the command line arguments
         * @throws java.text.ParseException
         */
        public static void main(String[] args) throws ParseException {
            Fenetre win = new Fenetre();
            win.affichage();
        }
        
    }

    Je suppose que c'est a partir de la ligne 64 qu'il faudrait ajouter le detail qui va arranger mon probleme pour les espaces.

    Je tiens a noter que j'ai utilisé addGap(), addContainerGap() et addPreferredGap() mais rien. Peut-etre je mis suis mal pris donc svp dites moi precisement ce qu'il faut ajouter et l'ajouter.

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2020 à 16:45:43

      Bonjour,

      Il suffit d'ajouter n'importe où :

      groupe.setAutoCreateGaps(true);

      Par contre, ta dimension verticale est définie n'importe comment et ton GroupLayout n'a aucun sens.

      Le principe du GroupLayout est de décrire la disposition des composants dans les deux dimensions séparément (verticalement et horizontalement).

      • Dans la dimension horizontale, on va décrire le fait que les JLabel sont à gauche, et les champs de saisie à droite.
        C'est un SequentialGroup qui contient 2 ParallelGroups de 6 éléments chacun.

      • Dans la dimension verticale, on va décrire que le JLabel panMatricule et Matricule sont tout en haut, puis que panNom et Nom sont juste en-dessous, puis panPrenom et Prenom encore en-dessous, etc.
        C'est un SequentialGroup qui contient 6 ParallelGroups de 2 éléments chacun.

      Dans ton code, on explique deux fois la même chose, à savoir qu'on a les 6 JLabels à gauche et les champs de saisie à droite.
      On n'explique jamais que les JLabels doivent être en face des champs de saisie.

      Résultat : les JLabels ne sont pas alignés avec les champs de saisie. Et comme les champs de saisie n'ont pas tous la même hauteur, la personne qui a écrit ce code a été obligée de trafiquer les espaces pour donner une vague impression d'alignement.
      Ca se voit quand on colorie les bordures des JLabels :

      Voilà le bon code à utiliser :

      horzGroupe
      		.addGroup(groupe.createParallelGroup().addComponent(panMatricule).addComponent(panNom).addComponent(panPrenom).addComponent(panTel).addComponent(panFiliere).addComponent(panCycl)) 
      		.addGroup(groupe.createParallelGroup().addComponent(Matricule).addComponent(Nom).addComponent(Prenom).addComponent(Telephone).addComponent(filiere).addComponent(jr1).addComponent(jr2));
      vertGroupe
      		.addGroup(groupe.createParallelGroup(GroupLayout.Alignment.CENTER)
      				.addComponent(panMatricule)
      				.addComponent(Matricule))
      		.addGroup(groupe.createParallelGroup(GroupLayout.Alignment.CENTER)
      				.addComponent(panNom)
      				.addComponent(Nom))
      		.addGroup(groupe.createParallelGroup(GroupLayout.Alignment.CENTER)
      				.addComponent(panPrenom)
      				.addComponent(Prenom))
      		.addGroup(groupe.createParallelGroup(GroupLayout.Alignment.CENTER)
      				.addComponent(panTel)
      				.addComponent(Telephone))
      		.addGroup(groupe.createParallelGroup(GroupLayout.Alignment.CENTER)
      				.addComponent(panFiliere)
      				.addComponent(filiere))
      		.addGroup(groupe.createParallelGroup(GroupLayout.Alignment.CENTER)
      				.addComponent(panCycl)
      				.addGroup(groupe.createSequentialGroup()
      						.addComponent(jr1)
      						.addComponent(jr2))); 

      -
      Edité par Zachee54 17 janvier 2020 à 16:48:18

      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2020 à 17:11:53

        Zachee54 a écrit:

        Bonjour,

        Il suffit d'ajouter n'importe où :

        groupe.setAutoCreateGaps(true);

        Ah...j'avais vu ça mais je l'ai ignoré... Merci

        Zachee54 a écrit:

        la personne qui a écrit ce code a été obligée de trafiquer les espaces pour donner une vague impression d'alignement.

        Je plaide coupable...:euh:

        EDIT--------------------------------------------------------------------------------

        J'ai rajouté ton code, et c'est propre, perfect, tout est aligné comme je le voulais et pas besoin de creer des bordures et espaces supplementaires(comme je voulais  pour laisser croire que c'est aligner...)

        Merci

        Je tiens a noter que j'ai modifié la ligne 65 en

        GroupLayout.SequentialGroup vertGroupe = groupe.createSequentialGroup();

        ( quelqu'un pourrai avoir ce meme probleme plus tard...)








        -
        Edité par Asmitta 17 janvier 2020 à 17:31:56

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2020 à 17:28:41

          Super ! Donc maintenant tu as les éléments pour comprendre le fonctionnement de GroupLayout ?

          C'est nettement plus pédagogique que si tu avais récupéré ce code de quelqu'un d'autre.

          -
          Edité par Zachee54 17 janvier 2020 à 17:29:10

          • Partager sur Facebook
          • Partager sur Twitter
            17 janvier 2020 à 18:07:02

            Zachee54 a écrit:

            Super ! Donc maintenant tu as les éléments pour comprendre le fonctionnement de GroupLayout ?

            -
            Edité par Zachee54 il y a 22 minutes

            Peut-etre...il parait que c'est le plus complexe des Layout mais je vais tout faire pour mieux le comprendre

            Mon probleme est resolu mais j'ai une petite preoccupation. Je veux ajouter un bouton "Enregistrer" tout en bas. Je voulais suivre ton raisonnement et ajouter bouton à vertGroupe et horzGroupe...mais y'a erreur. C'est un seul bouton, donc faudrait que ça soit centrer en bas. J'assimile encore GroupLayout donc stp, une astuce sur ce coup?

            EDIT---15h02-----------18/01/2019--------------------------------------------------

            J'ai reussi a ajouter c'est bon.

            Sujet clos.

            -
            Edité par Asmitta 18 janvier 2020 à 15:04:02

            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2020 à 9:18:47

              Asmitta a écrit:

              Je tiens a noter que j'ai modifié la ligne 65 en

              GroupLayout.SequentialGroup vertGroupe = groupe.createSequentialGroup();

              ( quelqu'un pourrai avoir ce meme probleme plus tard...)

              Oui en effet, le groupe vertical est séquentiel !
              J'ai oublié de le copier dans mon post. Bien vu ^^

              GroupLayout est en effet le plus compliqué. Précisément pour cette raison, c'est aussi celui qui permet de faire le plus de choses...
              Sinon, l'alternative est souvent d'imbriquer plusieurs panels les uns dans les autres. Souvent on imbrique des BoxLayout ou des BorderLayout.
              C'est une question de préférence, mais quand on maîtrise GroupLayout tout est plus simple.

              Pour ajouter un bouton centré en bas, il faut :

              • transformer le groupe horizontal en ParallelGroup, qui contiendra 1°) le groupe séquentiel actuel 2°) le nouveau bouton "enregistrer" ;
              • ajouter le nouveau bouton "enregistrer" à la fin du groupe vertical.
              • Partager sur Facebook
              • Partager sur Twitter
                20 janvier 2020 à 9:58:10

                Zachee54 a écrit:

                Pour ajouter un bouton centré en bas, il faut :

                • transformer le groupe horizontal en ParallelGroup, qui contiendra 1°) le groupe séquentiel actuel 2°) le nouveau bouton "enregistrer" ;
                • ajouter le nouveau bouton "enregistrer" à la fin du groupe vertical.

                Merci. J'avais reussi a ajouter mon bouton en bas mais c'etait pas centré.
                • Partager sur Facebook
                • Partager sur Twitter

                Espace entre les Composants d'un GroupLayout

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown