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

时间:2015-10-04 00:00:28

标签: java swing gridbaglayout

我做了一个简单的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);

我很高兴看到结果用户界面:

Desired result

我想在未连接到现有单元格的单元格中添加JButton。我希望它被一个空的空间分开。当我尝试这个时,新的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);

输出:

Undesired result

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

2 个答案:

答案 0 :(得分:3)

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

enter image description here

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

答案 1 :(得分:2)

  

我是否需要在单元格(2,0)中使用空的JPanel作为占位符?

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

或者,如果您想拥有一个占位符,那么您可以使用Box.createHorizontalStrut(...)轻松指定宽度。

  

更重要的是,为什么会发生这种情况?

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