将JLabel置于JPanel中心
我有一个来自JPanel
的面板。 我有一个从JLabel
派生的自定义控件。 我试图将这个自定义JLabel
放在我的面板上。
我知道这样做的唯一方法是使用空布局( setLayout(null)
),然后计算自定义JLabel的setLocation()
点,使其位于正确的位置。
在这个应用程序中,自定义JLabel
从一个面板物理移动到此面板,我相信先前在setLocation
设置的位置正在影响事物。 但是,当我将其设置为(0,0)时,组件会进入左上角。
BorderLayout
不起作用,因为当只提供1个组件并将其放入BorderLayout.CENTER
,中心部分会扩展以填充所有空间。
我使用BoxLayout
和component.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扩展网格单元以填充可用空间。