Java:“请等待”GlassPane未正确加载

时间:2016-03-07 10:54:20

标签: java multithreading swing glasspane

我有一个java例程需要几秒钟才能完成。我想加载一个GlassPane(可能带有“prease wait”消息),阻止用户在该例程执行时修改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带有“请稍候”的消息等等......

有关可能导致此问题的原因的任何想法?是否有其他更好的方法来获取我正在寻找的内容而不是使用GlassPaneThread

1 个答案:

答案 0 :(得分:3)

Swing不是线程安全的,所以你已经违反了Swing的单线程规则,可能是在两个账户上。首先,应该在EDT(事件调度线程)的上下文中显示和隐藏glassPane。

您的长时间运行过程应在美国东部时间执行。

我能想到的最简单的解决方案是使用SwingWorker。这提供了许多有用的机制,您可以使用这些机制在另一个线程中执行长时间运行或阻塞进程,并使用安全更新UI。

请查看Concurrency in SwingWorker Threads and SwingWorker了解详情