繁体   English   中英

JFrame启动显示延迟

[英]JFrame Start Up Display Delay

我在显示JFrame以及立即显示所有内容时遇到困难。 我想显示已经添加了所有ComponentsJFrame ,但是窗口似乎变得不清晰可见,请稍等片刻,然后在添加了Component焦点对准。 我的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));不会发生这种效果label.setPreferredSize(new Dimension(400,60)); ,因此尽管它可能只是相关性而非因果关系,但我猜测PreferredSize与它有某种关系。 但为什么?

此外,即使我在与主线程分开的单独的Runnable线程中创建GUI,也会发生这种效果。 尽管效果明显与线程执行的顺序有关,但我不认为是特定原因造成的。

启动时:

在此处输入图片说明

大约1秒后:

在此处输入图片说明

可能的延迟是由于系统需要初始化同步事件分发线程与本机系统才能呈现内容之前引起的。

您应该确保从事件调度线程的上下文中初始化并显示您的UI,这应该使初始启动更加同步...

在此处输入图片说明

看看初始线程了解更多详细信息

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);
            }
        });
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM