java - Swing 组件加载时间太长?

标签 java performance swing constructor jframe

我遇到过任何类型的 Swing 组件加载时间过长大约一天的问题。我尝试使用不同的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。

感谢您的帮助。

最佳答案

问题是,当您创建 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);
    }
}

关于java - Swing 组件加载时间太长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36325473/

相关文章:

java - 找出本月第一个星期日/星期一等的日期

angularjs - 无法减少 ng-repeat 中的观察者数量

java - 完美数表现

java - 为什么 Graphics 的绘制方法不考虑笔划属性?

java - 如何在隐藏一个 JFrame 的同时将一个 JFrame 移动到另一个 JFrame

java - adb shell 将当前所有目录复制到新文件夹

java - 如何隐藏/删除 Wicket 中的分页导航器上的标签

java - Swing:从其他应用程序中窃取焦点(在 OS X 中的可用性)

java - 如何以编程方式获取 JOptionPane 消息内容

c++ - 为什么排序组的分组求和比未排序的组慢?