将 JLabel 居中于 JPanel 上

2022-09-03 08:26:07

我正在使用 NetBeans GUI 构建器来处理我的布局(我对 LayoutManagers 很糟糕),并且我试图放置一个简单的 JLabel,以便它始终在其父 JPanel 内部居中(水平)。理想情况下,即使调整了 JPanel 的大小,这也将保持 true,但如果这是一个疯狂的编码量,那么在首次创建 JPanel 时,仅仅居中就足够了。

我自己处理布局已经够糟糕的了,但是由于 NetBeans GUI 生成器自动生成了不可变的代码,因此我无法弄清楚如何进行这种居中,而且我无法在网上找到任何帮助我的东西。

感谢任何能够引导我朝着正确方向前进的人!


答案 1

以下是使组件居中显示的四种方法:

4 Centered Components

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

class CenterComponent {

    public static JLabel getLabel(String text) {
        return getLabel(text, SwingConstants.LEFT);
    }

    public static JLabel getLabel(String text, int alignment) {
        JLabel l = new JLabel(text, alignment);
        l.setBorder(new LineBorder(Color.RED, 2));
        return l;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel p = new JPanel(new GridLayout(2,2,4,4));
                p.setBackground(Color.black);
                p.setBorder(new EmptyBorder(4,4,4,4));

                JPanel border = new JPanel(new BorderLayout());
                border.add(getLabel(
                    "Border", SwingConstants.CENTER), BorderLayout.CENTER);
                p.add(border);

                JPanel gridbag = new JPanel(new GridBagLayout());
                gridbag.add(getLabel("GridBag"));
                p.add(gridbag);

                JPanel grid = new JPanel(new GridLayout());
                grid.add(getLabel("Grid", SwingConstants.CENTER));
                p.add(grid);

                // from @0verbose
                JPanel box = new JPanel();
                box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS ));

                box.add(Box.createHorizontalGlue());
                box.add(getLabel("Box"));
                box.add(Box.createHorizontalGlue());
                p.add(box);

                JFrame f = new JFrame("Streeeetch me..");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane(p);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        });
    }
}

答案 2

通过使用 Borderlayout,您可以将任何 JComponents 放到 CENTER 区域。有关示例,请参阅堆栈溢出问题的答案 摆脱JPanels之间的差距。这应该有效。