The layout of the components in the project I'm working on didn't look correct, I suspect there's a bug in Swing. Basically, what appears to be happening is that the weightx
and weighty
proportions aren't being adhered to when the cells being laid out have varying minimum sizes and/or preferred sizes. I created a sample program to demonstrate this, here is the source:
package com.ensoftcorp.product.simmerge.gui.swing.dialogs;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestClass {
/**
* @param args
*/
public static void main(String[] args) {
try {
//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new TestClass();
} catch (Exception e) {
e.printStackTrace();
}
}
static final GridBagConstraints GBC_CELL = new GridBagConstraints();
static final GridBagConstraints GBC_ROWEND = new GridBagConstraints();
static final GridBagConstraints GBC_FILLROW = new GridBagConstraints();
static {
GBC_CELL.anchor = GridBagConstraints.NORTHWEST;
GBC_CELL.weightx = 0.5;
GBC_CELL.fill = GridBagConstraints.BOTH;
GBC_ROWEND.gridwidth = GridBagConstraints.REMAINDER;
GBC_FILLROW.gridwidth = GridBagConstraints.REMAINDER;
GBC_FILLROW.weightx = 1.0;
GBC_FILLROW.fill = GridBagConstraints.BOTH;
}
public TestClass() {
JFrame frame = new JFrame();
JPanel pnlContent = new JPanel(new GridBagLayout());
pnlContent.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
/*
* Layout "ruler" panel
*/
JPanel pnlRuler = new JPanel(new GridBagLayout());
pnlRuler.add(createRulerCell(Color.BLACK, Color.WHITE),GBC_CELL);
pnlRuler.add(createRulerCell(Color.BLACK, Color.WHITE),GBC_CELL);
pnlRuler.add(Box.createHorizontalGlue(),GBC_ROWEND);
/*
* Layout "correct" panel
*/
JPanel pnlGoodLayout = new JPanel(new GridBagLayout());
pnlGoodLayout.add(new JButton("JButton1"),GBC_CELL);
pnlGoodLayout.add(new JButton("JButton2"),GBC_CELL);
pnlGoodLayout.add(Box.createHorizontalGlue(),GBC_ROWEND);
pnlGoodLayout.add(new JButton("JButton3"),GBC_CELL);
pnlGoodLayout.add(new JButton("JButton4"),GBC_CELL);
pnlGoodLayout.add(Box.createHorizontalGlue(),GBC_ROWEND);
/*
* Layout "incorrect" panel
*/
JPanel pnlBadLayout = new JPanel(new GridBagLayout());
pnlBadLayout.add(new JButton("JButton1"),GBC_CELL);
pnlBadLayout.add(new JButton("JButton2"),GBC_CELL);
pnlBadLayout.add(Box.createHorizontalGlue(),GBC_ROWEND);
pnlBadLayout.add(new JButton("JButton number 3 is wide"),GBC_CELL);
pnlBadLayout.add(new JButton("JButton4"),GBC_CELL);
pnlBadLayout.add(Box.createHorizontalGlue(),GBC_ROWEND);
/*
* Add panels to main panel
*/
pnlContent.add(pnlRuler,GBC_FILLROW);
pnlContent.add(Box.createVerticalStrut(8),GBC_FILLROW);
pnlContent.add(pnlGoodLayout,GBC_FILLROW);
pnlContent.add(Box.createVerticalStrut(8),GBC_FILLROW);
pnlContent.add(pnlBadLayout,GBC_FILLROW);
/*
* Configure frame
*/
frame.getContentPane().add(pnlContent);
frame.setTitle("GridBagLayout Weight Bug?");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,200);
frame.setVisible(true);
}
JComponent createRulerCell(Color border, Color background) {
JPanel glue = new JPanel();
glue.setBorder(BorderFactory.createLineBorder(border));
glue.setBackground(background);
return glue;
}
}
The sample program has three groups...the first is a "ruler" of sorts to show the 50% mark. The second and third groups are panels using a GridBagLayout where each cell has a weightx
of 0.5. The only difference between the groups is the button text length, yet the second group does not evenly proportion the columns even though it has enough space to do so.
My question then is this: has anyone encountered this problem before, and have a workaround they would recommend?
P.S. - I am using jdk1.6.0_11, if that makes a difference.