Swing Java 中的 BorderLayout 无法正常工作

BorderLayout in Swing Java not working correctly

我在 Java 中创建了一个密码生成器,它运行良好。我的功能正常(经过大量的眼泪、汗水和鲜血 :)),但唯一剩下的问题是我的 GUI 布局。

我的方法如下:

这是结果

如您所见,这不是我想要的。但是如果我查看我的代码,它应该从上到下很好地放置。

哪里出错了?

我的代码:

构造函数(从 JFrame 扩展)

public PasswordGenerator(){
    this.setContentPane(ContentPane());
    this.setSize(500,270);
    this.setResizable(true);
    this.setVisible(true);
}

窗格:

private JPanel ContentPane()
{
    JPanel ContentPane = new JPanel();
    ContentPane.add(getTopPane(), BorderLayout.NORTH);
    ContentPane.add(getCenterPane(),BorderLayout.CENTER);
    ContentPane.add(getSouthPane(),BorderLayout.EAST);
    return ContentPane;
}

private JPanel getTopPane(){
    JPanel TopPane = new JPanel();
    JLabel intro = new JLabel("Password generator V1.0");
    intro.setFont(new Font("TimesRoman",Font.BOLD,20));
    TopPane.setLayout(new GridLayout(1,1));
    TopPane.add(intro);
    return TopPane;
}

private JPanel getCenterPane(){
    JPanel CenterPane = new JPanel();

    CenterPane.add(aantalChars);
    CenterPane.setLayout(new GridLayout(6,3));
    //8,2
    hidden.setVisible(false);
    hiddenL.setVisible(false);
    CenterPane.add(aantalCharsLabel);
    CenterPane.add(hidden);
    CenterPane.add(hidden);
    CenterPane.add(hiddenL);
    CenterPane.add(lowerCase);
    CenterPane.add(lowerCaseLabel);
    CenterPane.add(upperCase);
    CenterPane.add(upperCaseLabel);
    CenterPane.add(numberCase);
    CenterPane.add(numberCaseLabel);
    CenterPane.add(symbolCase);
    CenterPane.add(symbolCaseLabel);


    return CenterPane;
}

您忘记在 ContentPane 上将 BorderLayout 设置为 LayoutManager。仅仅使用正确的约束是不够的。您可以为此使用 ContentPane.setLayoutManager(),或者您可以直接在 JPanel.

的构造函数中给出 LayoutManager

JPanel 的默认布局管理器是 FlowLayout 管理器。 要使用 BorederLayout,您需要专门设置它:

private JPanel ContentPane()
        {
            JPanel ContentPane = new JPanel();
            //////////////////////////////////////////////
            ContentPane.setLayout(new BorderLayout());
            ////////////////////////////////////////////
            ContentPane.add(getTopPane(), BorderLayout.NORTH);
            ContentPane.add(getCenterPane(),BorderLayout.CENTER);
            ContentPane.add(getSouthPane(),BorderLayout.SOUTH);
            return ContentPane;
        }