GridBagLayout 是否需要空单元格的占位符面板?

Does GridBagLayout require placeholder panels for empty cells?

我做了一个简单的 GridBagLayout,它在单元格 (0,0)、(1,0) 和 (0,1) 中添加了按钮。

JPanel panelMain = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    panelMain.add(new JButton("0,0"),c);

    c.gridx = 1;
    c.gridy = 0;
    panelMain.add(new JButton("1,0"),c);

    c.gridx = 0;
    c.gridy = 1;
    panelMain.add(new JButton("0,1"),c);

我很高兴看到结果 UI:

我想在未连接到现有单元格的单元格中添加 JButton。我希望它被一个空的 space 分隔开。当我尝试这个时,新的 JButton 被集中在其他的旁边。这是补充:

JPanel panelMain = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    panelMain.add(new JButton("0,0"),c);

    c.gridx = 1;
    c.gridy = 0;
    panelMain.add(new JButton("1,0"),c);

    c.gridx = 0;
    c.gridy = 1;
    panelMain.add(new JButton("0,1"),c);

    c.gridx = 3;
    c.gridy = 0;
    panelMain.add(new JButton("3,0"),c);

输出:

JButton("3,0") 显示在单元格 (2,0) 处。我是否需要在单元格 (2,0) 中使用空的 JPanel 作为占位符?更重要的是,为什么会这样?

Do I need to use an empty JPanel as a place holder in the cell (2,0)?

您可以使用 "insets" 网格包约束在组件之间提供 space。阅读 How to Use GridBagLayout 上的 Swing 教程,了解有关插入约束的更多信息。

或者,如果您想要占位符,则可以使用 Box.createHorizontalStrut(...) 轻松指定宽度。

More importantly, why is this happening?

除非单元格中有组件,否则单元格没有大小。每个单元格彼此独立,那么您希望单元格 (2,0) 的大小是多少?

布局不知道 2,0 处的宽度应该是多少,除非 gridx = 2 中放置了一个组件。当您完成 UI 时,如果放置了任何组件,它应该看起来不错。例如:

在其他情况下,您可以添加空 JPanel,背景颜色与容器的背景颜色匹配。