Pourquoi GridBagLayout centre-t-il mes composants au lieu de les placer dans un coin?

Jusqu’ici, j’ai réussi à éviter autant que possible d’utiliser GridBagLayout (à la main), mais je ne pouvais pas l’éviter cette fois-ci et je lis le tutoriel du SUN sur GridBagLayout. Jusqu’à présent, tout ne se passe pas bien. Je pense que je comprends mal quelque chose.
Par exemple, j’essaie le code suivant (similaire à celui du post de SUN):

 public class MainFrame extends JFrame { public static void main(Ssortingng args[]) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainFrame frame = new MainFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame */ public MainFrame() { super(); setBounds(100, 100, 500, 375); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container mainContainer = getContentPane(); mainContainer.setLayout(new GridBagLayout()); //add label JLabel someLabel = new JLabel("Label 1:"); GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 0; constraints.gridy = 0; //constraints.anchor = GridBagConstraints.FIRST_LINE_START; //constraints.weightx = 0.5; mainContainer.add(someLabel, constraints); JTextField someText = new JTextField(30); constraints = new GridBagConstraints(); constraints.gridx = 1; constraints.gridy = 0; constraints.weightx = 0.5; mainContainer.add(someText, constraints); // } } 

J’obtiens l’étiquette et le champ de texte l’un à côté de l’autre au centre du cadre.
Mais je m’attendais à ce qu’ils apparaissent dans le coin supérieur gauche, puisque gridx et gridy ont la valeur 0 pour l’étiquette.
Même si je mets constraints.anchor = GridBagConstraints.FIRST_LINE_START; toujours le même résultat.
Est-ce que je me trompe ici?
Du post du soleil:

Spécifiez la ligne et la colonne en haut à gauche du composant. La colonne la plus à gauche a l’adresse gridx = 0 et la ligne supérieure a l’adresse gridy = 0.

    Ajouter des constraints.weighty = 1; aux contraintes JLabel et constraints.anchor = GridBagConstraints.NORTHWEST; aux contraintes TextField.

    MODIFIER:

    Du guide Oracle GridBagLayout :

    Des chiffres plus grands indiquent que la ligne ou la colonne du composant doit disposer de plus d’espace. Pour chaque colonne, le poids est lié au poids le plus élevé spécifié pour un composant dans cette colonne, le poids de chaque composant multicolonne étant divisé d’une manière ou d’une autre entre les colonnes dans lesquelles se trouve le composant. De même, le poids de chaque ligne correspond au poids le plus élevé spécifié pour un élément. composant dans cette rangée. L’espace supplémentaire tend à aller vers la colonne la plus à droite et la rangée du bas.

    Vous devez lire plus loin dans le tutoriel Swing pour la section sur weightX/weightY où il est écrit:

    Sauf si vous spécifiez au moins une valeur différente de zéro pour poidsx ou poids, tous les composants s’agglutinent au centre de leur conteneur.

    Vous avez spécifié un poids X mais pas un poids.

    Edit, c’est plus compliqué que je pensais. Il semble que vous deviez également spécifier:

     constraints.anchor = GridBagConstraints.FIRST_LINE_START; 

    pour les deux composants en plus du lourd.

    Je ne réponds peut-être pas directement à votre question, mais croyez-moi, vous devriez faire vos essais et erreurs sur les mises en page avec un IDE. Je suggère personnellement Netbeans . Là, vous pouvez glisser-déposer puis jeter un coup d’œil sur les propriétés. Au début, l’inspecteur de propriétés indiquait certaines valeurs par défaut et, par conséquent, moins de code généré automatiquement pour cela. Mais ensuite, une fois que vous commencez à jouer avec les mises en page, vous pouvez voir le code et bien comprendre comment vous faites.

    Vous pouvez y parvenir en utilisant une astuce, ajoutez un composant factice après votre ligne et développez-le pour remplir l’espace vertical. Aussi, vous pouvez réutiliser les contraintes, pas besoin de créer un nouvel object:

    EDIT: ok oubliez le truc 🙁 La bonne façon est comme dit Deon Botha et BenCole, j’ai mis à jour mon code en utilisant l’ancre

    N’acceptez pas cette réponse, acceptez soit Deon soit Ben

     public class MainFrame extends JFrame { public static void main(Ssortingng args[]) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainFrame frame = new MainFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public MainFrame() { super(); setBounds(100, 100, 500, 375); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container mainContainer = getContentPane(); mainContainer.setLayout(new GridBagLayout()); JLabel someLabel = new JLabel("Label 1:"); JTextField someText = new JTextField(30); GridBagConstraints constraints = new GridBagConstraints(); constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.gridx = 0; constraints.gridy = 0; constraints.weightx = 1.0; mainContainer.add(someLabel, constraints); constraints.gridx = 1; constraints.weightx = 1.0; constraints.weighty = 1.0; mainContainer.add(someText, constraints); } } 

    Cela a fonctionné pour moi:

     public class NewJFrame extends javax.swing.JFrame { public NewJFrame() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel2 = new javax.swing.JPanel(); jComboBox3 = new javax.swing.JComboBox(); jComboBox4 = new javax.swing.JComboBox(); jComboBox5 = new javax.swing.JComboBox(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setBackground(new java.awt.Color(255, 204, 51)); setMinimumSize(new java.awt.Dimension(800, 600)); getContentPane().setLayout(null); jPanel2.setLayout(new java.awt.GridBagLayout()); jComboBox3.setModel(new javax.swing.DefaultComboBoxModel(new Ssortingng[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; jPanel2.add(jComboBox3, gridBagConstraints); jComboBox4.setModel(new javax.swing.DefaultComboBoxModel(new Ssortingng[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; jPanel2.add(jComboBox4, gridBagConstraints); jComboBox5.setModel(new javax.swing.DefaultComboBoxModel(new Ssortingng[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel2.add(jComboBox5, gridBagConstraints); getContentPane().add(jPanel2); jPanel2.setBounds(30, 40, 150, 260); pack(); } public static void main(Ssortingng args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); } }); } private javax.swing.JComboBox jComboBox3; private javax.swing.JComboBox jComboBox4; private javax.swing.JComboBox jComboBox5; private javax.swing.JPanel jPanel2; }