Search code examples
javaswinggridbaglayout

Making GridBagLayout more compact


I am trying to accomplish the following with GridBagLayout:

The frame will receive a collection of "fields" (JLabel, JTextField pairs), I want to arrange them in a 'Grid-like' fashion where a row will contain 2 such pairs (JLabel1 JField1 JLabel2 JField2). When a row has these four components, the next components are added to another row.

EDIT: I would like the components to start at the top of the panel

My code produces the following layout. I would like the components to be laid out more compactly (especially the vertical distance)

pic

Here is the code:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Test extends JFrame{

private JPanel _panel;

public Test() {
    this.setDefaultCloseOperation(HIDE_ON_CLOSE);
    this.setResizable(true);
    this.setVisible(true);
    Dimension size = new Dimension(600,600);
    this.setMinimumSize(size);
    this.setSize(size);
    this.setPreferredSize(size);
    _panel = new JPanel();
    this.add(_panel);

}

public static void main(String[] args) {
    Test t = new Test();
    String[] labels = {"label1", "label2","label3","label4","label5"};
    String[] fieldValues = {"value1","value2","value3","value4","value5"};
    t.createFields(labels,fieldValues);
}

private void createFields(String[] labels, String[] fieldValues) {
    _panel.setLayout(new GridBagLayout());
    int col = 0;
    int row = -1;
    for(int i=0; i < labels.length;i++) {
        JLabel label = new JLabel(labels[i] + ":", JLabel.TRAILING);
        JTextField field = new JTextField(fieldValues[i]);
        Dimension size = new Dimension(200,30);
        field.setPreferredSize(size);
        label.setLabelFor(field);


        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weighty = 1;
        c.weightx = 1;
        c.ipadx = 0;
        c.ipady = 0;
        c.insets = new Insets(0,0,0,0);
        c.anchor = GridBagConstraints.LINE_START;
        c.gridx = col%4;
        if(i%2 == 0) row++;
        c.gridy = row;
        _panel.add(label,c);

        col++;
        c.gridx = col%4;
        _panel.add(field,c);
        col++;
    }

    this.setVisible(true);
}

Solution

  • If you don't mind your elements being in center of panel (vertically and horizontally), then remove

        c.weighty = 1;
        c.weightx = 1;
    

    from your code. If center is wrong place, add

        GridBagConstraints c = new GridBagConstraints();
        c.gridx=4;
        c.gridy=labels.length;
        c.weightx=1;
        c.weighty=1;
        _panel.add(new JLabel(),c);
    

    after your loop