JLabel不会出现,直到帧移出屏幕并再次返回

时间:2017-10-03 21:22:13

标签: java swing jframe jlabel

我有以下代码片段,除非我将JFrame移出屏幕再返回,否则不会显示JLabel。到目前为止,我试图将布局从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);

2 个答案:

答案 0 :(得分:2)

  1. 这一行:

    frame.setVisible(true);
    

    应该是程序中的最后一个,应该在将所有组件添加到程序后调用它。

  2. 您的代码的另一个问题是:

    startPage.setLayout(null);
    

    调用setLayout null将破坏您的GUI,对于复杂的GUI来说似乎很容易,但here是在另一台具有不同分辨率,OS,PLAF的机器上运行它时会发生什么的一个很好的例子。使用layout managers中的一个或组合。

答案 1 :(得分:0)

你有两个解决方案,在完成布局后调用frame.invalidate()或在完成布局后调用setVisible(true);