【问题标题】:Displaying JWindow in the event dispatching thread在事件调度线程中显示 JWindow
【发布时间】:2010-10-08 09:11:31
【问题描述】:

我想做的是在我的程序加载某些内容时出现一个小的启动屏幕。这就是我所拥有的:

SplashScreen.showSplashScreen();
// Do stuff that takes time.
SplashScreen.hideSplashScreen();

showSplashScreen() 方法所做的只是在屏幕中间创建一个新的 JWindow 并使其可见。

现在这段代码是从事件调度线程调用的,所以当调用 showSplashScreen() 方法时,在线程完成之前我看不到 JWindow,到那时,我不需要窗口了。在我等待时显示此初始屏幕的最佳方式是什么?

【问题讨论】:

    标签: java multithreading swing concurrency event-dispatch-thread


    【解决方案1】:

    不确定这是否是“最佳方式”,但我之前使用的一种机制是在 EDT 以外的线程上进行初始化,但使用 SwingUtilities.invokeAndWait 显示初始屏幕。这样,即使您的初始化很快(如果这是您想要的),您至少会看到启动屏幕。

    所以在你的初始化线程上,你去:

    SwingUtilities.invokeAndWait( /* Runnable to show splash screen */ );
    
    // Do stuff that takes time.
    
    SwingUtilities.invokeLater( /* Hide splash screen, display main GUI */ );
    

    【讨论】:

    • 确实是这样,无论您选择用作类。
    • 我尝试使用 invokeAndWait/invokeLater,但显然我不能,因为我已经在 EDT 中,所以我不能从那里使用它们...线程“AWT-EventQueue”中的异常-0" java.lang.Error: 不能从事件调度线程调用invokeAndWait
    • 啊,我看错你了,你的意思是把上面的代码放在一个单独的线程中?它实际上是在 ActionListener 的 actionPerformed 方法中,因为它是在用户单击按钮时调用的,所以我应该在那时创建一个新的 Thread 来处理它吗?
    • 嗯...我猜。但是,如果您的应用程序已经在运行,为什么还要显示启动画面?
    • Bleh,我就是这么称呼它的。它只是一个显示“正在加载...”的无边框窗口,我想在它加载文件时覆盖应用程序窗口。
    【解决方案2】:

    在 1.6 中引入了一个 java.awt.SplashScreen 类,尝试使用它吗?

    【讨论】:

    • 我不认为这正是我想要的。但即使是这样,大学的计算机在运行 1.6 时也存在问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2011-11-11
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多