java - Swing 线程安全样板

标签 java swing boilerplate edt

为了简单起见,想象一个下载​​文件的应用程序。有一个简单的 GUI,带有一个显示进度的标签。为了避免 EDT 违规,像每个合法公民一样,我在一个线程(主)中下载文件,并在另一个线程(EDT)中更新 GUI。因此,这是相关的伪代码块:

class Downloader {
    download() {
        progress.startDownload();
        while(hasMoreChunks()) {
            downloadChunk();
            progress.downloadedBytes(n);
        }
        progress.finishDownload();
    }
}

class ProgressDisplay extends JPanel {
    JLabel label;
    startDownload() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                label.setText("Download started");
            }
        });
    }
    downloadedBytes(int n) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                label.setText("Downloaded bytes: " + n);
            }
        });
    }
    finishDownload() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                label.setText("Download finished");
            }
        });
    }
}

我喜欢 Java 不支持闭包这一事实,而且代码对我来说非常清晰。抛开笑话不谈,我想知道……我做错了吗?是否有可能使用 SwingUtilities 消除所有这些丑陋的样板文件,在每个方法中匿名实现 Runnable 等?

我的情况比这稍微复杂一些,但我试图不通过实现代理或类似的东西来过度设计。

最佳答案

有一个专门用于该任务的类:SwingWorker 。它允许您在单独的线程中运行代码并在工作结束时更新 UI。

关于java - Swing 线程安全样板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216132/

相关文章:

java - 线程新手需要java方面的建议

php - 如何设置 Yii 样板文件?

java - Cucumber - 带参数的小 cucumber 注释

Java 静态 - 方法或字段?

java - 如何从 java 代码在 jboss cli 中启动嵌入式服务器?

java - 将 JScrollPane 滚动条移至右侧 SWING

Java 枚举和泛型

java - JFrame 类型的 createGUI() 方法未定义

HTML5 Boilerplate 和 1140px Grid……它们能一起工作吗?

css - 如何使用 .clearfix 类?