java - 在 JPanel 中将 JLabel 居中

标签 java swing layout layout-manager

我有一个从 JPanel 派生的面板。我有一个从 JLabel 派生的自定义控件。我正在尝试将这个自定义 JLabel 放在我的面板上。

我知道的唯一可行的方法是使用空布局 (setLayout(null)),然后计算自定义 JLabel 的 setLocation()指向正确的位置。

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

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

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

另一个答案提到覆盖面板的 getInset() 函数(我认为这就是它的名称),但事实证明这是一个死胡同。

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

最佳答案

设置 GridBagLayout对于 JPanel , 把 JLabel没有任何GridBagConstraintsJPanel , JLabel将居中

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();
            }
        });
    }
}

关于java - 在 JPanel 中将 JLabel 居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9829319/

相关文章:

java - 如何将图像添加到 JFrame 项目

java - 我可以在 Java Swing 应用程序中使用 Google Visualization API 吗?

android - Android 中的组合首选项

java - SWING JMenuBar JMenu 元素被压缩而不是换行。如何修复此行为

java - 续行 Spring SQL ScriptUtils(使用 H2)

Java 线程池执行器

java - JTextArea 未在 gui 中更新

Android GUI - 如何强制按钮到下一行?

Java 检测用户何时关闭笔记本电脑屏幕?

java - 从串行端口读取整个消息