JPanel中的GridBagLayout中的JButton

问题描述

我正在学习上周的挥杆动作,我在GridBagConstraints上存在一些问题,需要在左上角放置一个按钮,而在GridBagConstraints中将所有其他按钮认设置为?

我使用的代码不像原始代码,但指出了问题

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
class MyPanel extends JPanel
{
    JButton menu = new JButton("Menu"),button = new JButton("Puzzle");

    GridBagConstraints gbc1 = new GridBagConstraints(),gbc2 = new GridBagConstraints();

    private void setup()
    {
        gbc1.anchor   = GridBagConstraints.FirsT_LINE_START;
        gbc2.anchor   = GridBagConstraints.CENTER;
        gbc2.weightx  = 1.0;
        gbc2.weighty  = 1.0;
    }

    public MyPanel()
    {
        this.setLayout(new GridBagLayout());
        this.setup();
        this.button.setPreferredSize(new Dimension(250,140));
        this.add(menu,gbc1);
        this.add(button,gbc2);
    }
}

@SuppressWarnings("serial")
public class Test extends JFrame
{
    public test()
    {
        this.setTitle("Test");
        this.setContentPane(new MyPanel());
        this.setResizable(false);
        this.setSize(800,600);
        this.setVisible(true);
    }

    public static void main(String args[])
    {
        SwingUtilities.invokelater(() -> new test());
    }
}

输出

output

我希望菜单位于上角。

我从here阅读,但我不明白这一点。能否请您解释一下GridBagConstraints来做到这一点。

我希望这个问题可以清楚理解,否则请在评论中让我知道。

编辑:

@camickr建议有效,但有一个小问题,“拼图按钮”不在提取中心。

谢谢。

解决方法

默认情况下,除非其中一个组件的weightx / weighty值不等于0,否则GridBagLayout将显示所有水平和垂直居中的组件。然后,该组件将填充框架中的多余空间。

因此,如果要在“顶部/左侧”放置一个组件,在“中心”放置一个组件,则需要:

  1. 使用“锚定”约束。这两个组件都会有所不同。
  2. 位于中心的组件将需要使用“ weightx / weighty”约束。

但是,更轻松的解决方案可能是将面板与不同的布局管理器组合使用。

例如:

services.Configure<ADSettings>(setup =>
        {
            setup.DomainPath = Configuration["ADConf:DomainPath"];
            setup.DomainName = Configuration["ADConf:DomainName"];
            setup.Filter = Configuration["ADConf:Filter"];
            setup.ADUser = Configuration["ADConf:ADUser"];
            setup.ADPassword = Configuration["ADConf:ADPassword"];
            setup.DefaultPassword = Configuration["ADConf:DefaultPassword"];
        });
services.AddDbContext<SicWebAppDbContext>(options =>
        {
            options
            .UseLazyLoadingProxies()
            .UseSqlServer(Configuration["ConnectionString"]);
        });

因此,现在框架的“顶部”将包含一个面板,该面板的组件从左开始显示,而框架的“中心”将包含您的拼图,并以框架的其余空间为中心。

编辑:

我解决了这个问题,但是在中心部分将gridx和gridy设置为0,但是我并不完全了解这些设置

好吧,我提到您需要使用gridx / gridy约束。您应该始终使用这些约束,因为很明显要将组件添加到哪个网格。本教程中的示例始终指定这些值。

同时使用gridx / gridy都等于0确实没有道理。结果是您有两个组件试图共享同一网格。

删除setResizable(false)语句并缩小框架的大小,以查看按钮如何重新定位自身。

两个组件共享同一网格是不正常的。通常,您将在第一行拥有菜单,在第二行拥有按钮。这将使按钮在框架中水平居中,在菜单下方的空间中垂直居中。 你是做什么的