我试图理解org.jdesktop.swingx.BackgroundWorker
的机制。他们的javadoc提供了以下示例:
final JLabel label;
class MeaningOfLifeFinder implements BackgroundListener {
public void doInBackground(BackgroundEvent evt) {
String meaningOfLife = findTheMeaningOfLife();
evt.getWorker().publish(meaningOfLife);
}
public void process(BackgroundEvent evt) {
label.setText("" + evt.getData());
}
public void done(BackgroundEvent evt) {}
public void started(BackgroundEvent evt) {}
}
(new MeaningOfLifeFinder()).execute();
除了我怀疑结果是否会被发布之外,我想知道如何将label
传递给正在更新的进程方法。我认为它的范围仅限于BackgroudListener实现的外部。相当困惑我...对我有任何答案?
提前致谢
答案 0 :(得分:3)
这段代码显然已过时且不正确;另外,你必须把它放回到某个上下文中(我猜MeaningOfLifeFinder
是在另一个类中定义的。)
它不会编译,因为BackgroundListener
不存在(应该是BackgroundWorker
)并且是一个类而不是接口,因此implements
在这里不正确。
我认为该代码段应为:
class Something {
final JLabel label;
Something() {
// Instantiate label here
}
class MeaningOfLifeFinder implements BackgroundWorker {
public void doInBackground(BackgroundEvent evt) {
String meaningOfLife = findTheMeaningOfLife();
evt.getWorker().publish(meaningOfLife);
}
public void process(BackgroundEvent evt) {
label.setText("" + evt.getData());
}
public void done(BackgroundEvent evt) {}
public void started(BackgroundEvent evt) {}
}
void someAction() {
(new MeaningOfLifeFinder()).execute();
}
}
这应该更好。在这种情况下,您可以立即看到MeaningOfLifeFinder
的实例如何能够访问标签(因为它可以访问其嵌入类的任何成员)。
您必须确保someAction()
以某种方式被调用(例如,来自用户操作)。
答案 1 :(得分:1)
我不熟悉BackgroundWorker
,但它“建立在SwingWorker
之上。”如果没有设置ExecutorService
,则BackgroundWorker
默认为SwingWorker
,这可能是一种更易于学习的模型。将“BackgroundWorker
”生命周期中涉及的“两个线程”与“SwingWorker
”进行比较,“{{3}}可以与三个一起运行。”