我有一个java例程,需要几秒钟才能完成。我想加载一个GlassPane (可能在里面包含一个“预等待”消息),它可以防止用户在执行例程时修改UI,并且在例程结束时会自动隐藏。为此,我使用以下代码:
Thread t = new Thread(new Runnable(){
@Override
public void run() {
/*
* `getPresentation().getFrame()` are methods that return the
* Frame which contains my UI
*/
getPresentation().getFrame().setGlassPane(myGlassPane);
getPresentation().getFrame().getGlassPane().setVisible(true);
}
});
t.start();
//this is the routine that takes several seconds to be executed
runCEM();
//hide the GlassPane
getPresentation().getFrame().getGlassPane().setVisible(false);我将特定的java.awt.Cursor设置为myGlassPane。当我运行上面的代码时,我可以看到新的java.awt.Cursor出现了,但没有看到带有“请等待”消息的整个GlassPane等等.
知道是什么导致了这个问题吗?也许还有其他更好的方法来获得我想要的东西而不是使用GlassPane和Thread
发布于 2016-03-07 10:59:06
Swing并不是线程安全的,因此,您已经违反了Swing的单线程规则,可能在两个帐户上。首先,应该在EDT (事件分派线程)的上下文中显示和隐藏glassPane。
您的长时间运行的过程应该在EDT之外执行。
我能想到的最简单的解决方案是使用SwingWorker。这提供了许多有用的机制,您可以使用这些机制在另一个线程中执行长时间运行或阻塞进程,并使用这些机制安全地更新UI。
有关更多细节,请查看在Swing中并发和Worker和SwingWorker
https://stackoverflow.com/questions/35841888
复制相似问题