如果我在 doInBackground() 中有一个属于其他类的方法,是否可以根据外部类的其他方法中发生的更改来设置 setProgess() ?
问问题
1703 次
2 回答
5
你说:
但是当我将 setProgess() 放在另一个类的方法中时,它告诉我我需要创建该方法。
这与 SwingWorker 无关,与基本 Java 无关。没有类的有效实例,任何类都不能调用另一个类的实例(非静态)方法。要使您的代码正常工作,“其他”方法必须调用setProgress(...)
SwingWorker 的一个实例,因此您必须将 SwingWorker 的引用传递给该其他类。因此,将 SwingWorker(this
在 SwingWorker 内部)传递给另一个类,然后您就可以愉快地调用它的方法了。同样,这与线程、Swing 或 SwingWorkers 无关,而是基本的面包和黄油 Java。
编辑:由于 setProgress 是受保护的和最终的,你的 SwingWorker 必须有一个其他类可以调用的公共方法,并且在这个方法中 SwingWorker 需要调用它自己的setProgress(...)
方法。
例如,
MyWorker 类
public class MyWorker extends SwingWorker<Integer, Integer> {
private OtherClass otherClass;
public MyWorker() {
otherClass = new OtherClass(this);
}
@Override
protected Integer doInBackground() throws Exception {
otherClass.otherMethod();
return null;
}
// public method that exposes setProgress
public void publicSetProgress(int prog) {
setProgress(prog);
}
}
其他类:
class OtherClass {
MyWorker myWorker;
public OtherClass(MyWorker myWorker) {
this.myWorker = myWorker;
}
public void otherMethod() {
for (int i = 0; i < 100; i++) {
myWorker.publicSetProgress(i);
try {
Thread.sleep(200);
} catch (InterruptedException e) {}
}
}
}
于 2012-12-05T07:06:31.170 回答
1
只要您担心必须更新栏,您可以通过调用适当的方法在可以访问实例的任何地方实现它。它不依赖于方法或类。(对于 Java 中的每个对象都是如此)。
根据您的评论,您应该将对该栏的引用作为该方法中的参数传递。否则,您将无法访问它。
于 2012-12-05T06:55:05.073 回答