【问题标题】:Swing components taking too long to load?Swing 组件加载时间过长?
【发布时间】:2016-07-19 10:32:00
【问题描述】:

我在加载任何类型的摆动组件时都遇到了问题,现在加载时间太长了大约一天。我尝试使用不同的 IDE,我更新了 Java JDK,但是任何类型的 Swing 组件都需要很长时间才能加载,我目前正在我的引擎中使用它来加载项目并保存,但是显示时间太长了,所以我创建了一个只执行以下操作的空程序:

import javax.swing.JOptionPane;

public class main {
public main() {
}

public static void main(String[] args) {
    long now = System.currentTimeMillis();
    int result = JOptionPane.showOptionDialog(null, "Save before quitting ?", "Red Engine", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
    System.out.println(System.currentTimeMillis() - now + "ms");
}
}

这是结果:5015ms 所以加载它需要五秒钟,我也有同样的问题,只是初始化一个 JFrame。

import javax.swing.JFrame;

public class main {
public main() {
}

public static void main(String[] args) {
    long now = System.currentTimeMillis();
    JFrame frame = new JFrame();
    System.out.println(System.currentTimeMillis() - now + "ms");
}
}

这是结果:4505ms

那么 Java 到底发生了什么?这太令人沮丧了。我正在使用 jdk1.8.0_77 顺便说一句。

感谢您的帮助。

【问题讨论】:

  • 因为它必须启动事件调度线程并在核心操作系统中建立所需的连接,所以这可能并不那么令人惊讶。尝试从 EDT 的上下文中创建你的 UI,看看这是否会有所作为。更多详情请见Initial Threads

标签: java performance swing constructor jframe


【解决方案1】:

问题是,当您创建 Swing 框架/对话框时,您会启动巨大的 Swing 机器。 Swing 至少需要 3 个额外的线程才能工作,因此启动 Swing 应用程序可能需要比控制台应用程序稍长的时间(但最少)。

我已尝试重现您的结果,但只有 50 毫秒的帧创建时间(总共 80 毫秒)。即使我在主线程中初始化所有小部件,我也会得到相同的结果。为了获得正确的结果,您应该在 Swing 事件调度程序线程 (EDT) 中初始化所有 Swing 小部件。这是我的代码:

public class SwingTest {

    public static void main(String[] args) throws Exception {
        final long now = System.currentTimeMillis();
        // for correct result wee need to do all in the swing thread
        SwingUtilities.invokeAndWait(new Runnable() {

            @Override
            public void run() {
                final JFrame f = new JFrame();
                System.out.println(System.currentTimeMillis() - now);
                f.pack();
                f.setVisible(true);
            }
        });
        System.out.println(System.currentTimeMillis() - now);
    }
}

【讨论】:

  • System.out.println(System.currentTimeMillis() - now); 应该在f.setVisible(true); 之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2016-06-20
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多