I have this code:

JPanel controlPanel = new JPanel();
controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.PAGE_AXIS));
TitledBorder tb2 = BorderFactory.createTitledBorder(null, "Control Panel", 
        TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION, myFont, new Color(0, 153, 0));

JPanel fromDate = new JPanel();
fromDate.setLayout(new BoxLayout(fromDate, BoxLayout.X_AXIS));
fromDate.add(new JLabel("From date: "));
JButton fromDateButton = new JButton("...");
fromDateButton.setMaximumSize(new Dimension(100,15));
JPanel toDate = new JPanel();
toDate.setLayout(new BoxLayout(toDate, BoxLayout.X_AXIS));
toDate.add(new JLabel("Until date: "));
JButton toDateButton = new JButton("...");
toDateButton.setMaximumSize(new Dimension(100,15));
controlPanel.add(Box.createRigidArea(new Dimension(0,10)));
controlPanel.add(Box.createRigidArea(new Dimension(0,10)));

gui.add(controlPanel, BorderLayout.WEST);

Which produce this GUI (The relevant part is shown):

enter image description here

I want to have a label and a button right next to it. There should be a better way to achieve this. Any suggestions?

  • 1
    \$\begingroup\$ BoxLayout accepting min, max and preferred size, override these coordinates, but GBC is easier \$\endgroup\$ – mKorbel Jun 10 '13 at 12:44

When you create a form, a GridBagLayout is usually needed.

Here's one way to create the form in your question.

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SimpleGridBagLayout implements Runnable {

    public void run() {
        JFrame frame = new JFrame("GridBagLayout Test");

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(10, 10, 10, 10);
        gbc.gridwidth = 2;
        gbc.gridx = 0;
        gbc.gridy = 0;

        JLabel titleLabel = new JLabel("Control Panel");
        panel.add(titleLabel, gbc);

        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = 1;

        JLabel fromDateLabel = new JLabel("From date:");
        panel.add(fromDateLabel, gbc);


        JButton fromDateButton = new JButton("...");
        panel.add(fromDateButton, gbc);

        gbc.gridx = 0;

        JLabel toDateLabel = new JLabel("To date:");
        panel.add(toDateLabel, gbc);


        JButton toDateButton = new JButton("...");
        panel.add(toDateButton, gbc);

        frame.setSize(250, 200);

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SimpleGridBagLayout());

  • \$\begingroup\$ Thanks. Is there a way to resize the buttons? (Using setpreferredsize or setMaximumSize doesn't work for this Layout). \$\endgroup\$ – Maroun Jun 6 '13 at 6:56
  • \$\begingroup\$ @Maroun Maroun: The horizontal fill should ensure that the buttons are the same size. \$\endgroup\$ – Gilbert Le Blanc Jun 6 '13 at 6:59
  • \$\begingroup\$ Indeed. But I want then to be smaller than the size the horizontal fill makes. (Look at the image in my question) \$\endgroup\$ – Maroun Jun 6 '13 at 7:06

Add a glue in x 3 to get the extra space and then buttons won't get bigger.

panel.add(Box.createGlue(), gbc);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.