GridBagLayout不对齐jlabel和jbutton

时间:2018-07-19 13:01:54

标签: java jbutton jlabel gridbaglayout

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

}

不正确对齐的图像: Image of the incorrect alignment:

1 个答案:

答案 0 :(得分:0)

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

来自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。

因此锚点用于指定组件在其单元格中的位置。

这里有两个单元格:

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

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

  

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

尝试:

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