Java Backgroundworker:要更新的Widget的范围不清楚

时间:2010-03-21 22:54:53

标签: java multithreading swing backgroundworker

我试图理解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实现的外部。相当困惑我...对我有任何答案?

提前致谢

2 个答案:

答案 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}}可以与三个一起运行。”