Sha*_*ord 19 java layout swing layout-manager
我有一个来自的小组JPanel.我有一个自定义控件派生自JLabel.我试图将这个自定义JLabel放在我的面板上.
我知道这样做的唯一方法就是使用一个null布局(setLayout(null)),然后计算自定义JLabel的setLocation()点,使它在正确的位置.
JLabel在这个应用程序中,自定义从一个面板物理移动到此面板,我相信之前设置的位置setLocation正在影响事物.但是,当我将其设置为(0,0)时,组件会进入左上角.
BorderLayout不起作用,因为当只提供并放入一个组件时BorderLayout.CENTER,中央部分会扩展以填充所有空间.
我使用的切割和从其他网站粘贴示例BoxLayout及component.setAlignmentX(Component.CENTER_ALIGNMENT).这也不起作用.
另一个答案提到了覆盖小组的getInset()功能(我认为这就是所谓的),但事实证明这是一个死胡同.
到目前为止,我正在使用带有GridBagLayout布局的面板,GridBagConstraints当我将自定义JLabel插入面板时,我会包含一个对象.但这是低效的.有没有更好的方法让JLabel我的中心JPanel?
mKo*_*bel 35
设置的GridBagLayout的JPanel的,把一个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你JLabel叫label,然后使用:
label.setHorizontalAlignment(JLabel.CENTER);
Run Code Online (Sandbox Code Playgroud)
BoxLayout是要走的路.如果您设置X_AXIS BoxLayout,请尝试在组件之前和之后添加水平胶水:
panel.add(Box.createHorizontalGlue());
panel.add(label);
panel.add(Box.createHorizontalGlue());
Run Code Online (Sandbox Code Playgroud)
忘记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扩展网格单元以填充可用空间.