Size of buttons inside GridBagLayout

tianz picture tianz · Apr 25, 2013 · Viewed 7.5k times · Source

I have an 3 * 6 array of JButtons inside a GridBagLayout. But since the text length of each button may vary, each column of buttons has slightly different width. How do I make them have the same width?

Here is the code:

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 6; j++)
    {
        buttonConstraints.fill = GridBagConstraints.BOTH;
        buttonConstraints.weightx = 1;
        buttonConstraints.weighty = 1;
        buttonConstraints.gridx = j;
        buttonConstraints.gridy = i;
        buttonPanel.add(buttons[i * 6 + j], buttonConstraints);
    }
}

Thanks in advance.

Answer

mKorbel picture mKorbel · Apr 25, 2013

But since the text length of each button may vary, each column of buttons has slightly different width. How do I make them have the same width?

  • simple solution is to use GridLayout

  • GridBagLayout to create a columns, Dimension for each of column is calculated from PrefferedSize came from every JButtons in 1st row, these coordinates are used for rest of rows in the current container

EDIT

enter image description here

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GridFromGridBagLayout {

    private JFrame frame = new JFrame();
    private JPanel panel = new JPanel();

    public GridFromGridBagLayout() {
        panel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        for (int row = 0; row < 6; row++) {
            for (int col = 0; col < 3; col++) {
                JButton b = new JButton("(" + row + ", " + col + ")");
                b.putClientProperty("column", col);
                b.putClientProperty("row", row);
                b.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JButton btn = (JButton) e.getSource();
                        System.out.println("clicked column "
                                + btn.getClientProperty("column")
                                + ", row " + btn.getClientProperty("row"));
                    }
                });
                gbc.gridx = col;
                gbc.gridy = row;
                gbc.gridwidth = gbc.gridheight = 1;
                gbc.fill = GridBagConstraints.BOTH;
                gbc.anchor = GridBagConstraints.NORTHWEST;
                gbc.weightx = 33;
                gbc.weighty = 20;
                panel.add(b, gbc);
            }
        }
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GridFromGridBagLayout borderPanels = new GridFromGridBagLayout();
            }
        });
    }
}