为简单起见,想象一个下载文件的应用程序。有一个简单的 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
我的情况比这稍微复杂一些,但我试图通过实现代理或类似的东西来避免过度设计。