【发布时间】:2011-09-07 03:38:01
【问题描述】:
为简单起见,想象一个下载文件的应用程序。有一个简单的 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 等等?
我的情况比这稍微复杂一些,但我试图通过实现代理或类似的东西来避免过度设计。
【问题讨论】:
-
我不认为它是那丑。与闭包相比,您基本上只需额外的
new Runnable()。 -
和这个闭包比较?
runInEdt({label.setText("Download started");})甚至:runInEdt(someBiggerAction),其中someBiggerAction是方法名称。我知道我被污染了,这在 Java 中是不可能的,但我无法想象这么多年来每个人都违反 EDT 或编写这个 4 行包装器 100 次。 -
正如我所说,唯一的区别是
new Runnable。您现在可以拥有runInEdt。事实上你已经有了,它叫做SwingUtilities.invokeLater。 Java 有点罗嗦(按设计)。
标签: java swing boilerplate edt