将JLabel置于JPanel中心

Sha*_*ord 19 java layout swing layout-manager

我有一个来自的小组JPanel.我有一个自定义控件派生自JLabel.我试图将这个自定义JLabel放在我的面板上.

我知道这样做的唯一方法就是使用一个null布局(setLayout(null)),然后计算自定义JLabel的setLocation()点,使它在正确的位置.

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

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

我使用的切割和从其他网站粘贴示例BoxLayoutcomponent.setAlignmentX(Component.CENTER_ALIGNMENT).这也不起作用.

另一个答案提到了覆盖小组的getInset()功能(我认为这就是所谓的),但事实证明这是一个死胡同.

到目前为止,我正在使用带有GridBagLayout布局的面板,GridBagConstraints当我将自定义JLabel插入面板时,我会包含一个对象.但这是低效的.有没有更好的方法让JLabel我的中心JPanel

mKo*_*bel 35

设置的GridBagLayoutJPanel的,把一个JLabel没有任何的GridBagConstraints的JPanel,一个JLabel将居中

在此输入图像描述

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 16

Supose你JLabellabel,然后使用:

label.setHorizontalAlignment(JLabel.CENTER);
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的。它影响标签内容的位置,而不是标签在容器内的位置。 (2认同)

Jak*_*rka 8

BoxLayout是要走的路.如果您设置X_AXIS BoxLayout,请尝试在组件之前和之后添加水平胶水:

panel.add(Box.createHorizontalGlue());
panel.add(label);
panel.add(Box.createHorizontalGlue());
Run Code Online (Sandbox Code Playgroud)


ulm*_*ngt 8

忘记Java标准库中的所有LayoutManagers并使用MigLayout.根据我的经验,使用它通常更符合您的预期.

以下是如何完成使用MigLayout后的内容.

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Test
{
    public static void main( String[] args )
    {
        JFrame frame = new JFrame( );
        JPanel panel = new JPanel( );

        // use MigLayout
        panel.setLayout( new MigLayout( ) );

        // add the panel to the frame
        frame.add( panel );

        // create the label
        JLabel label = new JLabel( "Text" );

        // give the label MigLayout constraints
        panel.add( label, "push, align center" );

        // show the frame
        frame.setSize( 400, 400 );
        frame.setVisible( true );
    }
}
Run Code Online (Sandbox Code Playgroud)

大部分只是样板.关键是布局约束"push, align center":

align center 告诉MigLayout将JLabel放在其网格单元的中心.

push 告诉MigLayout扩展网格单元以填充可用空间.