为了简单起见,想象一个下载文件的应用程序。有一个简单的 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/