Java Swing - 使用BorderLayout将JLabel居中

时间:2017-10-29 18:03:58

标签: java swing jframe jpanel jlabel

我有一个作业,说明书指明我需要两个标签在屏幕上居中(水平和垂直)。
我知道这个问题已被多次询问,但每当我搜索到这个问题时,给出的解决方案通常是使用不同的布局管理器,比如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);

这就是它产生的: Current result
如何让“我的详细信息”和“错误消息”在窗口中间垂直和水平,一个在另一个之下,仍然使用BorderLayout?

编辑:对不起,我知道我不是很清楚。我给出的建议是“或许嵌套你的布局管理器,即将JPanel放在JFrame上的BorderLayout的中心。”

1 个答案:

答案 0 :(得分:1)

正如我在上面的评论中所说,你应该澄清当你说&#34时的意思;说明还指明我必须使用BorderLayout"。

如果您的内容窗格必须包含FlowLayout,其他面板可以采用不同的布局(例如代码中,因为您在子面板中使用了JPanel),它很容易解决你的问题。

您只需要在GridBagLayout中添加标签,该标签使用的布局可以对齐中心的标签,例如gridx = 0。 您的第一个标签将包含gridy = 0gridx = 0,第二个标签将包含gridy = 1insets。 您的第二个将完全低于第一个,您可以使用Insets.top创建一些空白区域(在下面的代码中我使用5个像素作为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); } } 内居中。因此,标签将在框架的中间垂直和水平对齐,就像在下面的screeenshot中一样:

enter image description here

代码示例:

BorderLayout

如果所有你的面板必须有{{1}},那么很难达到你想要的效果,但正如我所说,这将是一个疯狂的要求。