我最近一直在阅读有关在 JPanel 中居中 JLabel 的内容。我看到了很多以下两个答案:
label.setHorizontalAlignment(JLabel.CENTER);
并在 JLabel 的创建中
static JLabel label = new JLabel("Some Text Here", SwingConstants.CENTER);
我尝试过的这些选项都没有用。所有文本都与这两个答案保持一致(我什至尝试过同时使用它们,但没有成功)。这是我的一个标签及其实例化和所有内容的完整代码:
//JLabel title = new JLabel("Title", SwingConstants.CENTER);
JLabel title = new JLabel("Title");
title.setVisible(true);
title.setForeground(Color.BLACK);
title.setFont(new Font("Monospaced", Font.BOLD, 32));
//title.setHorizontalAlignment(JLabel.CENTER);
title.setLocation((int)width/2-190,10);
title.setSize(250,100);
frame.add(title);
我注释掉了刚刚对齐它并且应该可以工作的代码。对于设定的位置,我正在使用:
static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
static double width = screenSize.getWidth();
static double height = screenSize.getHeight();
定义屏幕的参数,然后使用它来保持居中有点抽象。但是,很明显,监视器大小发生变化,10 次中有 9 次,我在此处为 setLocation 编写的代码不会将其置于屏幕中央。
我真的很好奇为什么这对我不起作用。是因为我没有将 JLabel 添加到 JPanel 中吗?我假设 JLabel 可以像放置在 JPanel 上一样放置在 JFrame 上。
编辑
我也试过了
frame.add(title,BorderLayout.CENTER);
与上面的其他 2 个选项有相同的结果。
这对我有用(注意:SwingConstants.CENTER,而不是 SwingConstraints.CENTER):
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
JFrame jf = new JFrame();
jf.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( WindowEvent arg0 ) {
System.exit( 0 );
}
} );
JLabel t = new JLabel( "Centered", SwingConstants.CENTER );
jf.add( t, BorderLayout.CENTER );
jf.setSize( 300, 300 );
jf.setVisible( true );
}
} );
}
还有:
import java.awt.Color;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
public class CenterDemo2 {
public static void main(final String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame("Test frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel label = new JLabel("Test label");
label.setBorder(new LineBorder(Color.BLUE, 2)); //Adding a border for clarity.
//Most significant two lines of code:
final JPanel containerPanel = new JPanel(new GridBagLayout());
containerPanel.add(label);
frame.getContentPane().add(containerPanel); //or: frame.setContentPane(containerPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
JLabel
位于 JPanel
的(水平和垂直)中心。
屏幕截图,用鼠标拖动调整框架大小后: