2015-10-04 37 views
5

我做了一个简单的GridBagLayout,它在单元格(0,0),(1,0)和(0,1)中添加了按钮。GridBagLayout是否需要空单元格的占位符面板?

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:

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作为占位符?更重要的是,为什么会发生这种情况?

回答

3

除非在gridx = 2中放置了组件,否则布局不知道应该在2,0处留下的宽度应该是多少。当你完成UI时,如果有任何组件被放置,它应该看起来很好。对于例如为:

enter image description here

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

2

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

您可以使用“insets”网格包约束来给出组件之间的空间。有关插入约束的更多信息,请参阅How to Use GridBagLayout上的Swing教程。

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

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

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