GridBagLayout未按预期工作

3
我正在使用GridBagLayout编写地址簿GUI,但问题是当我设置gridx和gridy时,它似乎没有使用布局,组件会掉落在框架的中心。我只贴了一小段代码来展示一个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);

}

它应该放在哪里?尝试将 weightx/weight 设置为 1.0 并将 anchor 更改为 GridBagLayout.NORTH... 然后看看会发生什么;-) 我建议仔细阅读 GBL 文档和教程。 - Guillaume Polet
3个回答

0

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

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

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


此外,您的框架和面板设置为完全相同的大小 -
panel1.setSize(300,300);
...
frame.setSize(300, 300);

你可能想要将框架变大,以便实际看到panel1根据框架的布局管理器进行定位更改的效果。


但我确实在这里看到了将 GridBagLayout 设置为 JPanel 的方法:http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html。 - user1769501
好的,我已经添加了这个 frame.setLayout(new GridBagLayout()); 但它仍然不起作用... - user1769501
@SikanderNawaz 你是否像为你的jpanel一样为你的frame指定了约束条件? - sampson-chen
@SikanderNawaz,还请查看有关您的框架和JPanel大小问题的更新评论。 - sampson-chen
我应该如何为Frame添加它。我的意思是我已经为面板添加了gbc,然后用这个来定义gridx等参数,那么我是否应该为框架和面板添加不同的gbc1和gbc2,如果是这样,哪一个应该用于gridx? - user1769501

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

0

在设置时

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


为什么我要使用这个呢,gbc.anchor = GridBagConstraints.NORTH; 我的意思是,即使我正在编写整个Swing应用程序而不只是一个按钮,我还是应该使用它吗? - user1769501
1
NORTH是一个锚点,用于将按钮放置在容器的顶部。如果您有更多的组件,它们将填充网格单元格,因此您可能不需要锚点。 - Reimeus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接