我开发了一个 Java 应用程序来创建和提取存档 - 比如 WinRAR .您可以使用多线程同时创建多个存档。最近,我想在每次创建时在新的 JFrame 中以 JProgressBar 的形式在存档创建期间添加信息状态。
但我的问题是在新状态框架和创建存档的线程中生成信息。这就是我在存档线程中创建 JFrame 以更新当前进度条的原因。
但就像我可以在各种信息源和您的回答/评论中阅读它一样,它是针对 Java 的 Swing和表现;我无法在 EDT 的其他地方创建 swing 对象.
但是,我该如何解决我的问题呢?我怎样才能在我的归档文件的编写和它的状态 JFrame(使用 JProgressBar)之间建立通信?
编辑:
我实现了 SwingWorker 来管理我的应用程序中的 GUI。现在完成了,我还有一个问题:
使用 SwingWorker,我如何通过状态框架按钮上的事件来处理后台任务? (例如:暂停压缩或停止压缩。)
最佳答案
正如其他人所建议的,最好的方法是使用 SwingWorker
。
SwingWorker
属性是可监听的,监听器总是在 EDT 中被调用,因此,您可以执行如下操作:
public class ArchivingWorker extends SwingWorker<Void, Void> {
JProgressBar progressBar = null;
// Other members here...
...
public ArchivingWorker(...) {
// Any specific initialization here (in EDT)
addPropertyChangeListener(new PropertyChangeListener() {
@Override void propertyChange(PropertyChangeEvent e) {
if ( "state".equals(e.getPropertyName())
&& e.getNewValue() == StateValue.STARTED) {
// Background thread has just started, show a progress dialog here
progressBar = new JProgressBar();
...
}
else if ("progress".equals(e.getPropertyName())) {
// Update progress bar here with e.getNewValue()
...
}
}
});
}
@Override protected Void doInBackground() {
// Archiving process here and update progress from time to time
setProgress(progress);
return null;
}
@Override protected void done() {
// Ensure that archiving process worked correctly (no exception)
try {
get();
} catch (Exception e) {
// Handle exception (user feedback or whatever)
} finally {
// Close progress dialog
...
}
}
}
然后你可以根据需要使用ArchivingWorker
:
ArchivngWorker worker = new ArchivingWorker(...);
worker.execute();
关于java - 在多任务应用程序中管理 GUI 和 EDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7498640/