首页 > 解决方案 > GridBagLayout 未对齐 jlabel 和 jbutton

问题描述

所以我正在使用 GridBagLayout 并且我试图在 JPanel 的中心创建一个 JButton,然后在 JPanel 的最顶部有一个 JLabel。当我尝试这样做时,按钮和标签未对齐。

代码:

package view;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class StartPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    //Declare our global variables
    JButton btnUploadProject;
    JLabel heading;
    GridBagConstraints gbc;
    GridBagConstraints gbc2;
    /**
     * Create the panel.
     */
    public StartPanel() {
        //Set up Panel
        this.setVisible(true);
        setLayout(new GridBagLayout());

        //Create the components
        btnUploadProject = new JButton("Upload A Project");
        heading = new JLabel("Heading test");
        gbc = new GridBagConstraints();
        gbc2 = new GridBagConstraints();

        //Modify components
        btnUploadProject.setPreferredSize(new Dimension(400,100));
        btnUploadProject.setFont(new Font("Arial", Font.PLAIN, 40));
        heading.setFont(new Font("Arial", Font.PLAIN, 40));
        gbc.anchor = GridBagConstraints.CENTER;
        gbc2.anchor = GridBagConstraints.NORTH;
        gbc2.weighty = 1.0;
        //Add the buttons
        this.add(btnUploadProject, gbc);
        this.add(heading, gbc2);
    }

}

不正确对齐的图像: 不正确对齐的图像:

标签: javajbuttonjlabelgridbaglayout

解决方案


我相信您的“问题”来自锚参数的错误使用。

来自https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

锚点: 当组件小于其显示区域时使用,以确定放置组件的位置(在区域内)。有效值(定义为 GridBagConstraints 常量)为 CENTER(默认值)、PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_END 和 LAST_LINE_START。

所以anchor用来指定组件在他的cell中的位置。

这里有两个单元格:

  • 第一个(x:0,y:0):包含您的按钮,锚点= CENTER,您的按钮显示在单元格的中心
  • 第二个(x:1,y:0):包含您的标签,锚= NORTH,您的标签显示在单元格的北部

如您所见,单元格位于同一行。如果要将按钮放在标签下方,请使用 gridx/gridy 约束:

gridx, gridy 指定组件左上角的行列。最左列的地址为 gridx=0,顶行的地址为 gridy=0。使用 GridBagConstraints.RELATIVE(默认值)来指定将组件放置在刚刚添加到容器中的组件的右侧(对于 gridx)或正下方(对于 gridy)。我们建议为每个组件指定 gridx 和 gridy 值,而不仅仅是使用 GridBagConstraints.RELATIVE;这往往会导致更可预测的布局。

尝试:

gbc.gridy = 1;
gbc2.gridy = 0;

推荐阅读