我使用GridBagLayout编写地址簿GUI。问题是,当我设置gridx和gridy不起作用时,它看起来没有使用布局,组件落在Frame的中心。我没有粘贴整个代码只是1 JButton
的一小段代码,让你看看发生了什么......请看代码并告诉我如何解决它,现在按钮落在{{1}的中心{1}}
我只是初学者所以请不要介意愚蠢的样式代码或类似的任何问题
JFrame
答案 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);
请注意,我们还设置了weightx
和weighty
,以便按钮可以将其位置放在JFrame
的顶部:
答案 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);