【问题标题】:GridBagLayout not working as expectedGridBagLayout 未按预期工作
【发布时间】:2012-11-18 23:17:32
【问题描述】:

我正在使用 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);

}

【问题讨论】:

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

标签: java swing gridbaglayout


【解决方案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 顶部的位置:

【讨论】:

  • 我为什么要用这个,gbc.anchor = GridBagConstraints.NORTH;我的意思是,如果我编写整个 Swing 应用程序而不是 1 个按钮,我还应该使用它吗?
  • NORTH 锚点,用于显示如何将按钮放置在容器顶部。如果您有更多组件,它们将填充网格单元格,因此您可能不需要锚点。
【解决方案2】:

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

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

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


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

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

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

【讨论】:

  • 但我确实看到这里为 JPanel 设置了 GridBagLayout docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
  • 好的,我确实添加了这个 frame.setLayout(new GridBagLayout());还是不行..
  • @SikanderNawaz 您是否像为 jpanel 一样为您的框架指定了约束?
  • @SikanderNawaz 还看到更新的 cmets 关于您的框架和 jpanel 的尺寸问题。
  • 我应该如何为 Frame 添加它。我的意思是我确实为面板 gbc 添加了一个,然后将这个用于 gridx 等,所以我应该为框架和面板添加不同的一个作为 gbc1 和 gbc 如果是这样的话,哪个用于 gridx?
【解决方案3】:

我建议使用不同的布局,例如 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);

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    相关资源
    最近更新 更多