JFrame启动显示延迟

时间:2015-01-08 23:26:42

标签: java multithreading swing jframe delay

我在显示JFrame并且所有内容立即显示时遇到困难。我希望JFrame显示已添加的所有Components,但窗口似乎在焦点外可见,等待一秒钟,然后成为焦点Component( s)补充说。我的SSCCE代码极短/简单,所以我不知道为什么会出现这种影响。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DelayTest
{
    public static void main(String[] args)
    {
        JLabel label = new JLabel("DELAY TEST");
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setPreferredSize(new Dimension(400, 60));
        JFrame frame = new JFrame("Delay Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(label);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

我知道如果我发表评论label.setPreferredSize(new Dimension(400,60));,这种效果就不会发生,所以尽管它可能仅仅是一种相关性和不是因果关系,我猜不出PreferredSize与它有关。但是,为什么?

ALSO,即使我在除主线程之外的单独Runnable线程中创建GUI,也会发生此效果。虽然效果显然与线程执行的顺序有关,但我不认为具体因素是原因。

启动时:

enter image description here

大约1秒后:

enter image description here

1 个答案:

答案 0 :(得分:1)

可能的延迟是由于系统需要初始化事件调度线程与本机系统同步才能呈现内容。

您应确保初始化UI并在Event Dispatching Thread的上下文中显示,这应该使初始启动更加同步...

enter image description here

请查看Initial Threads了解详情

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestDelay {

    public static void main(String[] args) {
        new TestDelay();
    }

    public TestDelay() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JLabel label = new JLabel("Delay Test");
                Font font = label.getFont();
                label.setFont(font.deriveFont(Font.BOLD, 24f));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(label);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
相关问题