views:

38

answers:

2

Hi all,

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

+1  A: 

I'm unfamiliar with BackgroundWorker, but it "is built upon SwingWorker." Absent setting an ExecutorService, BackgroundWorker defaults to SwingWorker, which may be a more accessible model for study. Compare the "two threads involved in the life cycle of a BackgroundWorker" with "SwingWorker which can operate with three."

trashgod
+2  A: 

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).

jfpoilpret
Ah thanks ... your answer makes me becoming more confident in myself!