I’m working with the java swing LayoutManager GridBagLayout, and ran into this problem. I want a layout like this
ACC
BB
But get a layout like this
ACC
B
A and B take up the same number of columns despite B having a gridwidth of 2 where A’s gridwidth is 1. I don’t think there can be a vanishingly small column between A,B and C because C starts in column 1. The problem does not occur if C’s gridwidth is 1 instead of 2. I’m baffled by the output.
Why is this happening / how can I fix this?
JFrame test = new JFrame(); test.setSize(800,800); test.setLayout(new GridBagLayout()); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GridBagConstraints c; c = new GridBagConstraints(); c.gridx=0; c.gridy=0; c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.weighty = 1; test.add(new JButton("A"), c); c = new GridBagConstraints(); c.gridx=0; c.gridy=2; c.gridwidth=2; c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.weighty = 1; test.add(new JButton("B"), c); c = new GridBagConstraints(); c.gridx=1; c.gridy=0; c.gridwidth=2; c.gridheight=2; c.fill = GridBagConstraints.BOTH; c.weightx = 2; c.weighty = 2; test.add(new JButton("C"), c); test.setVisible(true);
Advertisement
Answer
I know how you feel… It seems GridBagLayout
reduces the width of columns to 0 when they are not filled by 1×1 component. I don’t know if the following is the most efficient solution, but it works (by adding two dummy JPanel
to “inflate” columns 1 and 2):
JFrame test = new JFrame(); test.setSize(800,800); test.setLayout(new GridBagLayout()); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GridBagConstraints c; c = new GridBagConstraints(); c.gridx=0; c.gridy=0; c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.weighty = 1; test.add(new JButton("A"), c); c = new GridBagConstraints(); c.gridx=0; c.gridy=1; c.gridwidth=2; c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.weighty = 1; test.add(new JButton("B"), c); c = new GridBagConstraints(); c.gridx=1; c.gridy=0; c.gridwidth=2; c.gridheight=1; c.fill = GridBagConstraints.BOTH; c.weightx = 2; c.weighty = 2; test.add(new JButton("C"), c); c = new GridBagConstraints(); c.gridx=1; c.gridy=2; c.gridwidth=1; c.gridheight=0; c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 1; c.weighty = 0; test.add(new JPanel(), c); c = new GridBagConstraints(); c.gridx=2; c.gridy=3; c.gridwidth=1; c.gridheight=0; c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 1; c.weighty = 0; test.add(new JPanel(), c); test.setVisible(true);