摆动组件需要太长时间才能加载?

时间:2016-03-31 06:10:34

标签: java performance swing constructor jframe

我现在遇到任何类型的挥杆组件都需要花费太长时间来装载大约一天的问题。我尝试使用不同的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 btw。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

我试图重现你的结果,但只有50ms的帧创建(总共80ms)。即使我在主线程中初始化所有小部件,我也会得到相同的结果。为了获得正确的结果,您应该在Swing Event Dispatcher Thread(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);
    }
}