我有一些代码在一个单独的线程中执行下载,创建这个代码以便JFrame GUI在下载过程中继续更新。但是,当我使用Thread.join()时,目的完全失败,因为它导致GUI停止更新。我需要一种方法来等待线程完成并仍然更新GUI。
答案 0 :(得分:4)
您可以让执行下载的任务也向GUI发起事件。
例如:
Runnable task = new Runnable() {
public void run() {
// do your download
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// call some method to tell the GUI that the download finished.
}
});
}
};
然后运行它,使用Executor(首选方法)或原始线程:
executor.execute(task);
或
new Thread(task).start();
正如评论中指出的那样,您通常会使用SwingWorker来执行此类操作,但您也可以执行上述手动方法。
SwingWorker提供了一种doInBackground
方法,您可以将下载逻辑放在一个done
方法中,您可以在其中使用代码来通知GUI下载完成并使用get
方法得到doInBackground
的结果(如果有的话)。
如,
class Downloader extends SwingWorker<Object, Object> {
@Override
public Object doInBackground() {
return doDownload();
}
@Override
protected void done() {
try {
frame.downloadDone(get());
} catch (Exception ignore) {
}
}
}
(new Downloader()).execute();