In the following GridBagLayout code, I\'m expecting the specified minimum size of JButton btn2 to be respected when the JFrame is resized to be made smaller. But when I mak
In addition to Andrew Thompson's answer:
It is therefore very much possible to make your component suddenly become larger than it was before when you downsize the containing frame. You only have to set a minimum size on it that is larger than the preferred size. So you are making the frame smaller, and suddenly your component becomes larger. That is... weird but possible :) All hail GBL.
Here is an example of a panel that implements this behavior (GBC is an easier class to use than the original GridBagConstraints):
private static JPanel getPanel() {
JPanel panel = new JPanel(new GridBagLayout());
final JTextField textField = new JTextField("test");
final String text = "text";
final JLabel label = new JLabel(text);
final JButton button = new JButton(new AbstractAction("Enlarge label!") {
private String actText = text;
@Override
public void actionPerformed(ActionEvent arg0) {
actText = actText + text;
label.setText(actText);
}
});
GBC g;
g = new GBC().locate(0, 0).weight(0.0, 0.0).align(GBC.WEST, GBC.HORIZONTAL, null);
textField.setMinimumSize(new Dimension(200,20));
panel.add(textField, g);
g = new GBC().locate(1, 0).weight(1.0, 0.0);
panel.add(label, g);
g = new GBC().locate(0, 1).weight(1.0, 1.0).span(2, 1);
panel.add(button, g);
return panel;
}
In general, I would say to not use components that must be fixed in size within a GBL. Wrap it inside other panels with different layout managers.
If you really want to use your fixed-sized component within a GBL, override its getPreferredSize() method and return the size you want. But I prefer to ignore these methods.
Maybe I have to set the minimum size of the JPanel that contains the buttons?
AFAIR GBL was notorious for ignoring sizing hints. No, a correction on that. To get sensible resizing of components within GBL, use the GridBagConstraints
with appropriate values. Beware though, the behavior of the layout to not display any component that would be forced to less than its minimum size.
I would pack()
the frame then set the minimum size on the frame. Here is how it might look, changing the last line to..
frame.pack();
frame.setVisible(true);
frame.setMinimumSize(frame.getSize());
Given the layout though, I would tend to put btn1
into the PAGE_START
of the BorderLayout
of a panel that is then added to the LINE_START
of another BL. btn2
would go in the CENTER
of the outer BL.