java - 在多任务应用程序中管理 GUI 和 EDT

标签 java multithreading swing user-interface event-dispatch-thread

我开发了一个 Java 应用程序来创建和提取存档 - 比如 WinRAR .您可以使用多线程同时创建多个存档。最近,我想在每次创建时在新的 JFrame 中以 JProgressBar 的形式在存档创建期间添加信息状态。

但我的问题是在新状态框架和创建存档的线程中生成信息。这就是我在存档线程中创建 JFrame 以更新当前进度条的原因。

但就像我可以在各种信息源和您的回答/评论中阅读它一样,它是针对 Java 的 Swing和表现;我无法在 EDT 的其他地方创建 swing 对象.

但是,我该如何解决我的问题呢?我怎样才能在我的归档文件的编写和它的状态 JFrame(使用 JProgressBar)之间建立通信?


编辑:

我实现了 SwingWorker 来管理我的应用程序中的 GUI。现在完成了,我还有一个问题:

使用 SwingWorker,我如何通过状态框架按钮上的事件来处理后台任务? (例如:暂停压缩或停止压缩。)

最佳答案

正如其他人所建议的,最好的方法是使用 SwingWorker

SwingWorker 属性是可监听的,监听器总是在 EDT 中被调用,因此,您可以执行如下操作:

public class ArchivingWorker extends SwingWorker<Void, Void> {
    JProgressBar progressBar = null;
    // Other members here...
    ...

    public ArchivingWorker(...) {
        // Any specific initialization here (in EDT)
        addPropertyChangeListener(new PropertyChangeListener() {
            @Override void propertyChange(PropertyChangeEvent e) {
                if (    "state".equals(e.getPropertyName())
                    &&  e.getNewValue() == StateValue.STARTED) {
                    // Background thread has just started, show a progress dialog here
                    progressBar = new JProgressBar();
                    ...
                }
                else if ("progress".equals(e.getPropertyName())) {
                    // Update progress bar here with e.getNewValue()
                    ...
                }
            }
        });
    }

    @Override protected Void doInBackground() {
        // Archiving process here and update progress from time to time
        setProgress(progress);

        return null;
    }

    @Override protected void done() {
        // Ensure that archiving process worked correctly (no exception)
        try {
            get();
        } catch (Exception e) {
            // Handle exception (user feedback or whatever)
        } finally {
            // Close progress dialog
            ...
        }
    }
}

然后你可以根据需要使用ArchivingWorker:

ArchivngWorker worker = new ArchivingWorker(...);
worker.execute();

关于java - 在多任务应用程序中管理 GUI 和 EDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7498640/

相关文章:

java - 如何在按下时获取按钮的变量名称?

java - OCSP响应中的responderID有什么用?

java - 是否有更现代的 OO 版本的 "Let' s Build a Compiler”?

multithreading - Tir 与其他 Lua Web 框架相比如何?

multithreading - 线程 - 消息传递

java - 摄氏度始终为 0.0?

java - 线程中的某些代码不重复

java - Itext7 - 嵌套表未在单元格内对齐

java - 无法从 mongodb 解析 json 格式的文档列表

c# - 检查 SendAsync 是否已完成发送