在 JPanel 中居中 JLabel

2022-09-01 13:36:27

我有一个派生自 的面板。我有一个从 派生的自定义控件。我试图在我的面板上以这种习俗为中心。JPanelJLabelJLabel

我知道要做到这一点,唯一可行的方法是使用空布局(),然后计算自定义JLabel的点,以便它位于正确的位置。setLayout(null)setLocation()

在此应用程序中,自定义从一个面板物理移动到此面板,我相信之前设置的位置正在影响事物。但是,当我将其设置为(0,0)时,组件会上升到左上角。JLabelsetLocation

BorderLayout不起作用,因为当只提供 1 个组件并将其放入 时,中心部分会扩展以填充所有空间。BorderLayout.CENTER

我从使用的另一个站点剪切并粘贴的示例和.这也不起作用。BoxLayoutcomponent.setAlignmentX(Component.CENTER_ALIGNMENT)

另一个答案提到覆盖面板的功能(我认为这就是它的名字),但这被证明是一个死胡同。getInset()

到目前为止,我正在使用具有布局的面板,并且在将自定义插入到面板中时会包含一个对象。但是,这是低效的。有没有更好的方法来居中在我的?GridBagLayoutGridBagConstraintsJLabelJLabelJPanel


答案 1

JPanel设置GridBagLayout,将没有任何GridBagConstraints的JLabel放入JPanelJLabel将居中

enter image description here

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

public class CenteredJLabel {

    private JFrame frame = new JFrame("Test");
    private JPanel panel = new JPanel();
    private JLabel label = new JLabel("CenteredJLabel");

    public CenteredJLabel() {
        panel.setLayout(new GridBagLayout());
        panel.add(label);
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                CenteredJLabel centeredJLabel = new CenteredJLabel();
            }
        });
    }
}

答案 2

Supose your 被称为 ,然后使用:JLabellabel

label.setHorizontalAlignment(JLabel.CENTER);