Java Swing工具的布局问题

Java Swing工具的布局问题,java,swing,layout,layout-manager,grid-layout,Java,Swing,Layout,Layout Manager,Grid Layout,我试图制作一个简单的GUI注册代码窗口,它有一个文本来输入代码,还有一个按钮来验证输入的代码是否正确。与此图像完全相同: 因此,我尝试使用java Swing库使用java实现GUI,这是我的代码: import java.awt.*; import javax.swing.*; public class MainClass { public static void main(String[] args) { // TODO Auto-generated metho

我试图制作一个简单的GUI注册代码窗口,它有一个文本来输入代码,还有一个按钮来验证输入的代码是否正确。与此图像完全相同:

因此,我尝试使用java Swing库使用java实现GUI,这是我的代码:

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

public class MainClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        final JFrame appFrame = new JFrame();
        final JPanel gridPanel = new JPanel(new GridLayout(2,1));
        
        
        Font f = new Font(Font.SERIF, Font.PLAIN, 20);
        JButton registerButton = new JButton("Register!");
        registerButton.setFont(f);
        JTextField verificationCodeText = new JTextField("--Enter your registration key here--");
        
        registerButton.setSize(30,20);
        verificationCodeText.setSize(50,20);
        verificationCodeText.setHorizontalAlignment(SwingConstants.CENTER);
        Border border = BorderFactory.createLineBorder(Color.BLACK, 5);
        verificationCodeText.setFont(f);
        verificationCodeText.setBorder(border);
        
        gridPanel.add(verificationCodeText);
        gridPanel.add(registerButton);
    
        appFrame.add(gridPanel);
        appFrame.setSize(400,400);
        appFrame.setVisible(true);
        
        System.out.println("End");
    }
}
但我得到的是:

我可以用布局做什么来纠正这个问题


(注意:忽略第一幅图像中的外部黑框,这只是为了澄清)

最好嵌套JPanel,根据需要混合布局,并使用填充,例如通过空边框,这比绝对设置大小要好。使用与此类似的代码例如,下面的示例使用BorderLayout作为总体布局,然后将使用JPanel(默认JPanel布局)的FlowLayout添加到主JPanel的顶部,并将使用JPanel的GridBagLayout添加到主JPanel的中心。如果以默认(无约束)方式添加,GridBag将使单个组件居中:


最好嵌套JPanel,根据需要混合布局,并使用空白边框等填充,这比绝对设置大小要好。使用与此类似的代码例如,下面的示例使用BorderLayout作为总体布局,然后将使用JPanel(默认JPanel布局)的FlowLayout添加到主JPanel的顶部,并将使用JPanel的GridBagLayout添加到主JPanel的中心。如果以默认(无约束)方式添加,GridBag将使单个组件居中:


嵌套您的JPanel以实现此效果,并且不使用GridLayout我必须使用哪种类型的JPanel?哪种类型必须嵌套?下面是一个示例。但是没有什么是一成不变的——玩你的代码,做实验,看看什么最有效……看看Oracle的教程,布局管理器的视觉指南:嵌套你的JPanel以实现这一效果,不要使用GridLayout我必须使用哪种类型的JPanel?哪种类型必须嵌套?下面是一个示例。但任何东西都不是一成不变的——玩你的代码,做实验,看看什么最有效……看看Oracle的教程,一本布局管理器的视觉指南:
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class RegistrationGUI extends JPanel {
    private JButton registerButton = new JButton("Register!");
    private JTextField verificationCodeText = new JTextField("--Enter your registration key here--", 20);
    
    public RegistrationGUI() {
        JPanel topPanel = new JPanel();
        int gap = 35;
        topPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        verificationCodeText.setHorizontalAlignment(SwingConstants.CENTER);
        topPanel.add(verificationCodeText);
        
        JPanel bottomPanel = new JPanel(new GridBagLayout());
        gap = 60;
        bottomPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        bottomPanel.add(registerButton);

        
        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.PAGE_START);
        add(bottomPanel, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        RegistrationGUI mainPanel = new RegistrationGUI();
        JFrame frame = new JFrame("Registration");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}