Java JLabel在帧移出屏幕并再次返回之前不会出现

Java JLabel在帧移出屏幕并再次返回之前不会出现,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,我有以下代码片段,其中JLabel不会显示,除非我将JFrame移出屏幕并再次移入。我尝试将布局从null更改为BorderLayout或FloatLayout,但迄今为止运气不佳。有什么想法吗 public class StartPage extends Main{ // Global variables private JPasswordField passField = new JPasswordField(); private String infoLabel = "<html

我有以下代码片段,其中JLabel不会显示,除非我将JFrame移出屏幕并再次移入。我尝试将布局从null更改为BorderLayout或FloatLayout,但迄今为止运气不佳。有什么想法吗

public class StartPage extends Main{

// Global variables
private JPasswordField passField = new JPasswordField();
private String infoLabel =  "<html>Bla, bla some text</html>";

// CONSTRUCTOR
public StartPage() {
    frame.setSize(1400, 1000);
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setResizable(false);
    startPage.setBounds(0, 0, 1400, 1000);  
    startPage.setLayout(null);
    frame.getContentPane().add(startPage);

    // TITLE LABEL
    JLabel lblTitle = new JLabel("My Title");
    lblTitle.setForeground(Color.RED);
    lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
    lblTitle.setFont(new Font("Arial Black", Font.BOLD, 30));
    lblTitle.setBounds(190, 150, 1000, 85);
    startPage.add(lblTitle);

    // TEXT LABEL       
    JLabel areaText = new JLabel(infoLabel, SwingConstants.CENTER); 
    areaText.setVerticalAlignment(SwingConstants.CENTER);
    areaText.setBounds(315, 220, 750, 300);
    areaText.setFont(new Font("Arial Black", Font.PLAIN, 15));  
    areaText.setVisible(true);
    startPage.add(areaText);
公共类起始页扩展了主{
//全局变量
private JPasswordField passField=new JPasswordField();
私有字符串infoLabel=“Bla,Bla some text”;
//建造师
公共起始页(){
框架设置尺寸(1400、1000);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setresizeable(false);
起始页后退(0,0,1400,1000);
startPage.setLayout(空);
frame.getContentPane().add(开始页);
//标题标签
JLabel lblTitle=新JLabel(“我的头衔”);
lblTitle.setForeground(颜色:红色);
Lblitle.设置水平对齐(旋转恒温器中心);
lblTitle.setFont(新字体(“Arial黑色”,Font.BOLD,30));
lblTitle.立根(190、150、1000、85);
起始页。添加(lblTitle);
//文本标签
JLabel areaText=新的JLabel(信息标签,SwingConstants.CENTER);
areaText.setVerticalAlignment(SwingConstants.CENTER);
区域文本.立根(315220750300);
setFont(新字体(“Arial黑色”,Font.PLAIN,15));
areaText.setVisible(真);
开始页。添加(区域文本);

您有两种解决方案,完成布局后调用frame.invalidate(),或完成布局后调用setVisible(true)

  • 这一行:

    frame.setVisible(true);
    
    应该是程序中的最后一个,应该在将所有组件添加到程序中后调用它

  • 代码的另一个错误是:

    startPage.setLayout(null);
    
    调用
    setLayout
    null将破坏您的GUI,对于复杂的GUI来说这似乎很容易,但这是一个很好的例子,说明当您在另一台具有不同分辨率、操作系统、PLAF等的机器上运行它时会发生什么。请使用其中一种或多种方法的组合


  • 我已经在最后调用了
    startPage.setVisible(true)
    ,只是忘了将其添加到上面的代码段中。或者您是指整个框架,因为startPage只是一个面板?您必须调用frame.setVisible而不是其他字段。JFrame是窗口。否则您需要调用frame.invalidate()在方法的最后谢谢。问题是我在添加所有组件之前验证了JFrame。正确的答案是在我的构造函数的最后调用
    frame.setVisible(true)
    ,这正是我的意思--不要调用
    setVisible(true)
    在JFrame上,直到添加完所有组件。否则它们将无法可靠显示。此外,除非您喜欢困难的调试会话,否则请避免绝对定位。非常感谢,这解决了问题。您是个天才