title: GridBagLayout weight bug?
body: <p>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 <code>weightx</code> and <code>weighty</code> 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:</p>
  
  <pre><code>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;
      }
  
  }
  </code></pre>
  
  <p>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 <code>weightx</code> 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.</p>
  
  <p>My question then is this:  has anyone encountered this problem before, and have a workaround they would recommend?</p>
  
  <p>P.S. - I am using jdk1.6.0_11, if that makes a difference.</p>