当我的耗时代码位于publish()
未包含的方法中时,我无法找到一种方法来调用setProgress()
和/或SwingWorker
。
举例说明:
class Task extends SwingWorker<Void, Void> {
@Override
protected void process(List<Void> chunks) {
// Process
}
@Override
protected Void doInBackground() throws Exception {
getData(this);
return null;
}
@Override
protected void done() {
// Done.
}
}
public Object[][] getData(SwingWorker worker) {
worker.publish(); // <-- publish() is protected, unavailable from outside.
worker.setProgress(1); // <-- same with setProgress().
return new Object[0][0];
}
此代码抛出编译器错误,因为publish()
和setProgress()
受到保护,因此即使您拥有该对象也无法访问。
这有什么变通方法吗?如果需要将所有内容都包含在要发布的SwingWorker
中,那将是不幸的。我的getData()
任务非常耗时,我想让用户了解正在发生的事情。
希望这个问题有道理。
答案 0 :(得分:3)
您始终可以为SwingWorker类提供其他类可以调用的公共方法。这些可能就像其中一个受保护方法的包装方法一样简单:
public void mySetProgress(int progress) {
super.setProgress(progress);
}
更好的方式:
另一种方法是重新考虑你的程序结构 - 让你的对象用getData(...)
方法返回临时结果,SwingWorker可以通过某种观察机制监听它,然后让工人根据需要调用它的发布方法
编辑2
您在评论中说明:
两者都是我想到的解决方案,但它们似乎都有不幸的后果。我的getData()方法有大约20个步骤,我想通过它发布。制作一个返回中间结果的程序结构需要我将其分解为更小的方法并将结果传递给每个方法。看起来好像工作太多= /
不,不需要额外的方法。您的getData(...)方法需要做的就是定期更新类属性并通知侦听器。然后,侦听器(此处为您的SwingWorker)可以提取类属性并使用它调用publish。