I have this window that has a JScrollPane
almost all over it. I'm adding large buttons (that have images attached to them) to it and I expect them to keep adding downwards, thats why I'm using a GridBagLayout
and I set gbc.gridx, gbc.gridy
everytime I add a button.
The scrolling thing works fine:
but the problem is, when I add less than 4 buttons, they align to the center of the row, instead to the left side as I want them to. Like this
Any idea how can I align them to the left? I tried gbc.anchor
and gbc.fill
but no luck. Thanks
Here's the panel inside my JScrollPane
private JPanel imagesPanel() {
JPanel panel = new JPanel(new GridBagLayout());
int x = 0;
int y = 0;
GridBagConstraints c = new GridBagConstraints();
//c.anchor = GridBagConstraints.NORTHWEST;
//add all images as buttons
List<PuzzleImage> imageList = _imageLoader.getImageCollection().getAllImages();
for(PuzzleImage puzzleImage : imageList) {
for(int i = 0; i < 1; i++) { //ignore this, just for debugging. i add 3 images
ImageIcon imageIcon = new ImageIcon(puzzleImage.getLowScaleImage());
c.gridx = x;
c.gridy = y;
c.weightx = 1.0;
JButton btn = new JButton(imageIcon);
btn.setPreferredSize(new Dimension(ImageLoader.LOW_SCALE_IMAGE_SIZE, ImageLoader.LOW_SCALE_IMAGE_SIZE));
panel.add(btn, c);
x++;
if(x>=4) {
x = 0;
y++;
}
}
}
return panel;
}
but the problem is, when I add less than 4 buttons, they align to the center of the row, instead to the left side as I want them to
At least one of the components need to have a weightx
constraint greater than 0.
Read the section from the Swing tutorial on How to Use GridBagLayout. The section that explains how the constraints works will provide more information.
Why are you even using a GridBagLayout
? You were given a simple solution I your last question: FlowLayout in Swing doesn't move to the next line. Then you don't even need to worry about constraints.
Or you could use a GridLayout
You simply define that you want 4 columns and components automatically wrap. You may need to nest panels so components don't shrink/grow depending on the size of the frame.
Basic code is:
JPanel wrapper = new JPanel();
JPanel buttons = new JPanel( new GridLayout(0, 4) );
for (...)
{
JButton button = new JButton(...);
buttons.add( button );
}
frame.add(wrapper);