3

我正在使用 GridBagLayout 编写地址簿 GUI。问题是,当我设置不工作的 gridx 和 gridy 时,它看起来因为没有使用布局并且组件落在 Frame 的中心。我不是将整个代码粘贴为 1 的一小段代码,JButton 让您看看发生了什么.. 请查看代码并指导我如何修复它,现在按钮落在了 JFrame

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

public class rect  
{
 JFrame frame ; 
 JPanel panel1 ; 
 JButton b1;
 GridBagConstraints gbc; 

 public  rect()
{
    panel1 = new JPanel();  
    panel1.setSize(300,300);
    panel1.setLayout(new GridBagLayout());
    gbc = new GridBagConstraints();

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


    b1= new JButton () ;
    b1.setText("Hello ");
    gbc.gridx=1; 
    gbc.gridy=0; 

    panel1.add(b1, gbc) ; 

    frame.add(panel1);
    panel1.setVisible(true);
    frame.setVisible(true);

}
4

3 回答 3

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);

请注意,我们还设置了weightxandweighty以便按钮可以在 的顶部占据它们的位置JFrame

带有 2 个 NORTH 锚定组件的 GridBagLayout

于 2012-11-30T18:36:45.923 回答
0

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

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

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


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

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

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

于 2012-11-30T17:42:30.377 回答
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);
于 2012-11-30T18:05:20.810 回答