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

标签 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 之外,是否有其他更好的方法来获取我正在寻找的内容?

最佳答案

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

您的长时间运行的进程应该在 EDT 之外执行。

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

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

关于Java: "please wait"GlassPane 未正确加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35841888/

相关文章:

java - 在没有 GUI 的情况下启动 JavaFX 应用程序线程

java - 使用jsp向浏览器显示动态生成的图像

java - 是否有必要使原始实例变量可变?

java - 固定位置的 JFrame 布局

java - 在java swing中动态添加复选框

executeQuery() 中的 Java MYSQL 异常

java - 什么是使 Java8 流生成格式化字符串的高效方法

c# - `System.MulticastDelegate` 是线程安全的吗?

java - Erlang JInterface - OtpMBox 线程安全吗?

java - TableCellRenderer 为许多单元格设置颜色,而不仅仅是一个