将JLabel置于JPanel中心

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

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

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

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

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

另一个答案提到覆盖面板的getInset()函数(我认为这就是所谓的),但事实certificate这是一个死胡同。

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

为JPanel设置GridBagLayout ,将没有任何GridBagConstraints的 JLabel放到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(); } }); } } 

将您的JLabel称为label ,然后使用:

 label.setHorizontalAlignment(JLabel.CENTER); 

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

 panel.add(Box.createHorizontalGlue()); panel.add(label); panel.add(Box.createHorizontalGlue()); 

忘记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 ); } } 

大多数只是样板。 关键是布局约束: "push, align center"

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

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