【问题标题】:JFrame Start Up Display DelayJFrame 启动显示延迟
【发布时间】:2015-01-08 23:26:42
【问题描述】:

我在显示 JFrame 时遇到困难,所有内容都会立即显示。我想显示已添加所有 ComponentsJFrame,但窗口似乎变得失焦,请稍等,然后在添加 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));,这种影响就不会发生,所以虽然它可能只是一种相关而不是因果关系,但我猜想PreferredSizes 与它有关。但是,为什么?

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

启动时:

大约 1 秒后:

【问题讨论】:

  • 确保 UI 在 EDT 的上下文中启动

标签: java multithreading swing jframe delay


【解决方案1】:

可能的延迟是由于系统需要在渲染内容之前初始化事件调度线程与本机系统的同步。

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

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

}

【讨论】:

  • 但是,如果在label.setFont(font.deriveFont(Font.BOLD, 24f));之后直接添加label.setPreferredSize(new Dimension(400,60));,则会出现完全相同的问题。即使在我的代码中,注释掉我在JLabel 上调用setPreferredSize() 的行也可以解决问题。我想知道的是如何解决这个问题删除ComponentpreferredSize的设置。
  • 你为什么使用setPreferredSize
  • 我想使用它的程序有一个带有许多组件的 GUI,我想从他们的preferredSizes 开始。这是我能想到的最简单的 SSCCE 来复制它。
  • 也就是说,除了避免它,没有办法解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2015-11-04
  • 2011-01-24
相关资源
最近更新 更多