Java:"please wait" GlassPane 未正确加载

Java: "please wait" GlassPane not correctly loaded

我有一个 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 和 "please wait" 消息等等...

知道是什么导致了这个问题吗?除了使用 GlassPaneThread 之外,还有其他更好的方法来获得我正在寻找的东西吗?

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

你的长 运行 过程应该在 EDT 之外执行。

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

查看 Concurrency in Swing and Worker Threads and SwingWorker 了解更多详情