Java GridBagLayout行跨度问题

Java GridBagLayout行跨度问题,java,gridbaglayout,Java,Gridbaglayout,我在GridBagLayout上遇到了一个奇怪的问题。我将其简化为一个简单的示例,包含4个面板、2个列和3行。面板具有首选尺寸,以使其成为方形1和4或矩形2和3 Expected Real result --------------- --------------- | 1 | 3 | | 1 | 3 | | | | | | |

我在GridBagLayout上遇到了一个奇怪的问题。我将其简化为一个简单的示例,包含4个面板、2个列和3行。面板具有首选尺寸,以使其成为方形1和4或矩形2和3

   Expected                  Real result
---------------            ---------------
|  1   |  3   |            |  1   |  3   |
|      |      |            |      |      |
|      |      |            |      |      |
|------|      |            |------|      |
|  2   |      |            : space|      |
|      |      |            |------|      |
|      |------|            |  2   |------|
|      |  4   |            |      | space:
|      |      |            |      |------|
|      |      |            |      |  4   |
---------------            |      |      |
                           |      |      |
                           ---------------
                           : extra space :
                           ...............
按照面板编号的顺序添加面板会产生一个糟糕的结果,实际上不是预期的结果,而将添加顺序更改为1-3-2-4会产生一个好结果。 水平转置它会得到类似的结果。 我不明白为什么添加顺序很重要,也不明白为什么行在面板之间有额外的空间重叠

我的逻辑遗漏了什么? 如何在不增加订单考虑的情况下实现预期结果

我试过MigLayout和它的单元格放置功能:它落在同一个洞里,顺序不会改变任何东西

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestLayout
{
  public static void main(String[] args)
  {
    JFrame frame = new JFrame("test gridbag");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container contentPane = frame.getContentPane();
    contentPane.setLayout(new GridBagLayout());

    Dimension rectDim = new Dimension(100, 200);
    Dimension carDim = new Dimension(100, 100);

    JPanel panel1 = new JPanel();
    panel1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    panel1.add(new JLabel("1"));
    panel1.setPreferredSize(carDim);
    GridBagConstraints c1 = new GridBagConstraints();
    c1.gridx = 0;
    c1.gridy = 0;
    c1.gridheight = 1;
    contentPane.add(panel1, c1);

    JPanel panel2 = new JPanel();
    panel2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    panel2.add(new JLabel("2"));
    panel2.setPreferredSize(rectDim);
    GridBagConstraints c2 = new GridBagConstraints();
    c2.gridx = 0;
    c2.gridy = 1;
    c2.gridheight = 2;
    contentPane.add(panel2, c2);

    JPanel panel3 = new JPanel();
    panel3.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    panel3.add(new JLabel("3"));
    panel3.setPreferredSize(rectDim);
    GridBagConstraints c3 = new GridBagConstraints();
    c3.gridx = 1;
    c3.gridy = 0;
    c3.gridheight = 2;
    contentPane.add(panel3, c3);

    JPanel panel4 = new JPanel();
    panel4.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    panel4.add(new JLabel("4"));
    panel4.setPreferredSize(carDim);
    GridBagConstraints c4 = new GridBagConstraints();
    c4.gridx = 1;
    c4.gridy = 2;
    c4.gridheight = 1;
    contentPane.add(panel4, c4);

    // TODO change add order to 1-3-2-4 for expected result

    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

仅供将来使用-使用第三方布局管理器-MigLayout是我的最爱