2010-03-21 6 views
0

J'essaie de comprendre le mécanisme de org.jdesktop.swingx.BackgroundWorker. Leurs javadoc présente l'exemple suivant:Java Backgroundworker: Portée du Widget à mettre à jour peu claire

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

Outre le fait que je doute que le résultat sera jamais faire publier, je me demande comment label est passé à la méthode de traitement, où il est mis à jour. Je pensais que sa portée était limitée à l'extérieur de l'implémentation de BackgroudListener. Assez confus je suis ... des réponses pour moi?

Merci à l'avance

Répondre

3

Cet extrait est manifestement obsolète et incorrect; De plus, vous devez le replacer dans un contexte (je suppose que MeaningOfLifeFinder est défini dans une autre classe).

Il ne sera pas compilé car BackgroundListener n'existe pas (devrait être BackgroundWorker) et est une classe pas une interface, par conséquent, est incorrect ici.

Je pense que l'extrait doit se lire comme:

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

Cela devrait fonctionner mieux. Dans ce cas, vous voyez immédiatement comment l'instance de MeaningOfLifeFinder pourra accéder à l'étiquette (puisqu'elle peut accéder à n'importe quel membre de sa classe d'intégration).

Vous devez juste vous assurer que someAction() est appelé d'une manière ou d'une autre (par exemple à partir d'une action de l'utilisateur).

+0

Ah merci ... votre réponse me rend plus confiant en moi-même! –

1

Je suis peu familier avec BackgroundWorker, mais il « est construit sur SwingWorker. » L'absence d'un ExecutorService, BackgroundWorker par défaut à SwingWorker, qui peut être un modèle plus accessible pour l'étude. Comparez les "deux threads impliqués dans le cycle de vie d'un BackgroundWorker" avec "SwingWorker qui peut fonctionner avec trois."

Questions connexes