Ta Sas Ta Sas - 3 days ago 5
Java Question

Java Backgroundworker: Scope of Widget to be updated unclear

I am trying to understand the mechanism of

org.jdesktop.swingx.BackgroundWorker
. Their javadoc presents following example:

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();


Apart from the fact that I doubt the result will ever get published, I wonder how
label
is passed to the process method, where it is being updated. I thought its scope was limited to the outside of the BackgroudListener implementation. Quite confused I am ... any answers for me?

Thanks in advance

Answer

This snippet is obviously out of date and incorrect; in addition, you have to put it back into some context (I guess MeaningOfLifeFinder is defined inside another class).

It won't compile because BackgroundListener doesn't exist (should be BackgroundWorker) and is a class not an interface, hence implements is incorrect here.

I think the snippet should read like:

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();
   }
}

This should work better. In this case, you immediately see how the instance of MeaningOfLifeFinder will be able to access label (since it can access any member of its embedding class).

You just have to make sure that someAction() gets called somehow (eg from a user action).

Comments