繁体   English   中英

Java Swing - 使用 BorderLayout 将 JLabel 居中

[英]Java Swing - Center a JLabel using BorderLayout

我有一个任务,说明指定我需要两个标签在屏幕上居中(水平和垂直)。
我知道这个问题已经被问过很多次了,但是每当我搜索这个问题时,给出的解决方案通常是使用不同的布局管理器,比如 BoxLayout。 但是,说明还指定我必须使用 BorderLayout。
最初我没有将标签添加到面板,而是直接将它们添加到框架中,但这不起作用,所以我被建议将它们都放在 JPanel 上,这也不起作用。

我的代码目前看起来像这样:

    JButton butSubmit = new JButton("Submit");
    JButton butReset = new JButton("Reset");

    JLabel nameAndReg = new JLabel("My details", SwingConstants.CENTER);
    JLabel errorMsg = new JLabel("The error message", SwingConstants.CENTER);
    nameAndReg.setForeground(Color.blue);

    JTextField redVal = new JTextField(3);
    JTextField greenVal = new JTextField(3);
    JTextField blueVal = new JTextField(3);

    JPanel butPanelSouth = new JPanel();
    JPanel butPanelNorth = new JPanel();
    JPanel labsPanel = new JPanel();

    butPanelSouth.add(redVal);
    butPanelSouth.add(greenVal);
    butPanelSouth.add(blueVal);
    butPanelSouth.add(butSubmit);
    butPanelNorth.add(butReset);
    labsPanel.add(nameAndReg, BorderLayout.CENTER);
    labsPanel.add(errorMsg, BorderLayout.CENTER);

    add(labsPanel, BorderLayout.CENTER);
    add(butPanelNorth, BorderLayout.NORTH);
    add(butPanelSouth, BorderLayout.SOUTH);

这就是它产生的结果: 当前结果
如何让“我的详细信息”和“错误消息”垂直和水平地位于窗口中间,一个在另一个之下,并且仍然使用 BorderLayout?

编辑:对不起,我意识到我不是很清楚。 我得到的建议是“也许嵌套你的布局管理器,即将 JPanel 放在 JFrame 上 BorderLayout 的中心”。

正如我在上面的评论中所说,当你说“说明还指定我必须使用BorderLayout ”时,你应该澄清你的意思。

如果您的意思是您的内容窗格必须具有BorderLayout ,并且其他面板可以具有不同的布局(例如在您的代码中,因为您在子面板中使用FlowLayout ),那么很容易解决您的问题。

您只需在 JPanel 中添加标签,该JPanel使用在中心对齐标签的布局,就像GridBagLayout一样。 您的第一个标签将有gridx = 0gridy = 0 ,第二个标签将有gridx = 0gridy = 1 您的第二个将正好低于第一个,您可以使用insets创建一些空白空间(在下面的代码中,我使用 5 个像素作为Insets.top )。

由于您的labsPanel将位于BorderLayout.CENTER ,因此面板将占用框架中的所有空白空间,并且GridBagConstrains.anchor默认值( GridBagConstrains.CENTER )确保您的标签在您的labsPanel内居中。 结果,标签将在框架的中间垂直和水平对齐,如下面的屏幕截图所示:

在此处输入图像描述

代码示例:

import java.awt.*;
import javax.swing.*;
public class Test
{
    public static void main (String [] a) {
        SwingUtilities.invokeLater (new Runnable () {
            @Override public void run () {
                createAndShowGUI ();
            }
        });
    }
    private static void createAndShowGUI () {
        JFrame frame = new JFrame ("Test");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setContentPane (new MainPanel ());
        frame.pack ();
        frame.setLocationRelativeTo (null);
        frame.setVisible (true);
    }
}
class MainPanel extends JPanel
{
    public MainPanel () {
        super (new BorderLayout ());

        JLabel nameAndReg = new JLabel ("My details", SwingConstants.CENTER);
        JLabel errorMsg = new JLabel ("The error message", SwingConstants.CENTER);
        nameAndReg.setForeground(Color.blue);

        JPanel labsPanel = new JPanel (new GridBagLayout ());

        labsPanel.add (nameAndReg);

        GridBagConstraints c = new GridBagConstraints ();
        c.gridy = 1;
        c.insets = new Insets (5, 0, 0, 0);
        labsPanel.add (errorMsg, c);

        JButton butSubmit = new JButton("Submit");
        JButton butReset = new JButton("Reset");

        JTextField redVal = new JTextField(3);
        JTextField greenVal = new JTextField(3);
        JTextField blueVal = new JTextField(3);

        JPanel butPanelSouth = new JPanel ();
        JPanel butPanelNorth = new JPanel ();

        butPanelSouth.add (redVal);
        butPanelSouth.add (greenVal);
        butPanelSouth.add (blueVal);
        butPanelSouth.add (butSubmit);

        butPanelNorth.add (butReset);

        add (labsPanel, BorderLayout.CENTER);
        add (butPanelNorth, BorderLayout.NORTH);
        add (butPanelSouth, BorderLayout.SOUTH);
    }
}

如果您的所有面板都必须有BorderLayout ,那么很难实现您想要的,但正如我所说,这将是一个疯狂的要求。

发布的代码只是有一个错误。 以下行:

labsPanel.add(nameAndReg, BorderLayout.CENTER);

与面板的构造不一致 - 无参数构造函数默认为 Flow Layout(因此添加的 2 个标签彼此相邻出现):

JPanel labsPanel = new JPanel();

要使用边框布局约束,面板必须使用BorderLayout

JPanel labsPanel = new JPanel(new BorderLayout());

但请注意,您只能将单个组件添加到BorderLayoutCENTRE位置。 如果您希望这两个标签在垂直中心“流动”在一起,您可能需要嵌套另一个JPanel

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM