Java GridBagLayout-向约束添加边距,以将组件从中心移动到顶部

Java GridBagLayout-向约束添加边距,以将组件从中心移动到顶部,java,swing,user-interface,layout-manager,gridbaglayout,Java,Swing,User Interface,Layout Manager,Gridbaglayout,我正在开发我的第一个应用程序来实践布局管理器,我开始学习GridBagLayout,我想创建一个带有徽标和登录框的登录窗口 当前我的应用程序如下所示: (来源:) 我觉得logo离登录框太近了,离顶部太远了,因此我需要找到一种方法,从底部给logo留一个边距,这样它就有点向顶部移动,所以两个组件之间会有一个空间,logo就在顶部栏附近 可以使用GridBagLayout吗 我尝试过将Insets设置为0,0,0,110,但它会将徽标向左移动一点,不知道为什么 @Override public

我正在开发我的第一个应用程序来实践布局管理器,我开始学习GridBagLayout,我想创建一个带有徽标和登录框的登录窗口

当前我的应用程序如下所示:


(来源:)

我觉得logo离登录框太近了,离顶部太远了,因此我需要找到一种方法,从底部给logo留一个边距,这样它就有点向顶部移动,所以两个组件之间会有一个空间,logo就在顶部栏附近

可以使用GridBagLayout吗

我尝试过将Insets设置为
0,0,0,110
,但它会将徽标向左移动一点,不知道为什么

@Override
public void init() throws Exception {
    GridBagLayout layout = new GridBagLayout();
    super.setLayout(layout);
    this.loginPane = new JPanel();
    this.loginPane.setSize(400, 400);
    this.loginPane.setBackground(Color.RED);
    JTextField username = new JTextField();
    username.setSize(200, 45);

    BufferedImage logo = ImageIO.read(new File("assets/logo.png"));
    JLabel logoLabel = new JLabel(new ImageIcon(logo));

    GridBagConstraints t = new GridBagConstraints();
    t.ipadx = logo.getWidth();
    t.ipady = logo.getHeight();
    t.gridx = 0;
    t.gridy = 0;

    super.add(logoLabel, t);
    t.ipadx = 500;
    t.ipady = 300;
    t.gridwidth = 1;
    t.gridheight = 1;
    t.gridy++;
    super.add(loginPane, t);
}

如何执行此操作?

可以使用其他属性更好地控制组件的宽度和高度(以百分比为单位)

  • 指定如何分配额外的水平空间

  • 指定如何分配额外的垂直空间

它最好在上的Swing教程下展开

尝试
t.weighty=0.5
将在
50%-50%之间分割,并将组件也放置在中心。让我知道它是否符合你的需要


  • 使用符合组件首选尺寸的
    frame.pack()
    而不是
    frame.setSize()

  • 重写
    getPreferredSize()
    以设置
    JPanel
    的首选大小,而不是使用
    setSize()
    方法

示例代码:

JPanel panel = new JPanel() {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};
我尝试将Insets设置为0、0、0、110,它会将徽标移动到 左边一点,不知道为什么

@Override
public void init() throws Exception {
    GridBagLayout layout = new GridBagLayout();
    super.setLayout(layout);
    this.loginPane = new JPanel();
    this.loginPane.setSize(400, 400);
    this.loginPane.setBackground(Color.RED);
    JTextField username = new JTextField();
    username.setSize(200, 45);

    BufferedImage logo = ImageIO.read(new File("assets/logo.png"));
    JLabel logoLabel = new JLabel(new ImageIcon(logo));

    GridBagConstraints t = new GridBagConstraints();
    t.ipadx = logo.getWidth();
    t.ipady = logo.getHeight();
    t.gridx = 0;
    t.gridy = 0;

    super.add(logoLabel, t);
    t.ipadx = 500;
    t.ipady = 300;
    t.gridwidth = 1;
    t.gridheight = 1;
    t.gridy++;
    super.add(loginPane, t);
}
这是因为插图的顺序是:上、左、下、右


尝试
0,0,110,0
将其从底部偏移。

我本人是一个巨大的Swing开发人员,我要说的是:如果您正在花时间学习一个新的API,我建议您学习JavaFX而不是Swing。在这一点上,Swing几乎不受欢迎。