Java Backgroundworker: область виджетов будет обновлена ​​неясно - PullRequest
0 голосов
/ 22 марта 2010

Я пытаюсь понять механизм 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 ]

3 голосов
/ 22 марта 2010

Этот фрагмент явно устарел и неверен; кроме того, вы должны поместить его обратно в некоторый контекст (я думаю, 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 голос
/ 22 марта 2010

Я незнаком с BackgroundWorker, но он "построен на SwingWorker". При отсутствии установки ExecutorService, BackgroundWorker по умолчанию SwingWorker, что может быть более доступной моделью для изучения. Сравните «два потока, вовлеченные в жизненный цикл BackgroundWorker» с «SwingWorker, который может работать с тремя».

...