GridBagLayout无法按预期工作

时间:2012-11-30 17:35:53

标签: java swing gridbaglayout

我使用GridBagLayout编写地址簿GUI。问题是,当我设置gridx和gridy不起作用时,它看起来没有使用布局,组件落在Frame的中心。我没有粘贴整个代码只是1 JButton的一小段代码,让你看看发生了什么......请看代码并告诉我如何解决它,现在按钮落在{{1}的中心{1}}

我只是初学者所以请不要介意愚蠢的样式代码或类似的任何问题

JFrame

3 个答案:

答案 0 :(得分:1)

设置

gbc.gridx = 1;
gbc.gridy = 0;

对于GridBagConstraints,您没有像使用绝对定位那样设置绝对坐标。相反,您要设置组件所在的网格单元格。在上面的示例应用程序中,只有一个组件,因此只有一个网格单元格,因此默认情况下JButton将位于中心位置。

要突出显示这一事实,我们可以添加锚点到NORTH并添加另一个按钮,创建2个网格单元格:

gbc.anchor = GridBagConstraints.NORTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;

gbc.gridx = 1;
gbc.gridy = 0;

panel1.add(new JButton("Hello"), gbc);

gbc.gridx = 2; // now a 2nd cell exists
panel1.add(new JButton("Test"), gbc);

请注意,我们还设置了weightxweighty,以便按钮可以将其位置放在JFrame的顶部:

GridBagLayout with 2 NORTH-Anchored Components

答案 1 :(得分:0)

您的最终目标缺少一些细节,但是:

您的相框没有布局管理器,因此您的JPanel将最终位于相框中间。您添加到面板的任何内容(例如JButtons)将根据GridBagLayout布局(但您的框架不知道如何定位窗格,因为您的框架没有布局管理器)。将您的框架视为一个容器,将您的窗格视为另一个容器。

为您的框架设置GridBagLayout,类似于为窗格设置的方式。


此外,您的相框和面板设置为完全相同的尺寸 -

panel1.setSize(300,300);
...
frame.setSize(300, 300);

您可能希望根据框架的布局管理器使框架更大,以实际看到panel1定位更改的效果。

答案 2 :(得分:0)

我建议使用不同的布局,例如BorderLayout。例如,你可以

panel1 = new JPanel();  
panel1.setSize(300,300);
panel1.setLayout(new BorderLayout());

frame= new JFrame("Address ?ooK "); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
b1= new JButton ("Hello") ;

panel1.add(gbc) ; 

frame.add(panel1,BorderLayout.CENTER));
frame.add(b1,BorderLayout.PAGE_END));
panel1.setVisible(true);
frame.setVisible(true);