トップ 一覧 置換 検索 ヘルプ RSS ログイン

SwingWorker を使ったイベント処理の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
別スレッドで、Swingのイベントを処理する仕組み。
別スレッドだけど、定期的にディスパッチスレッドへ処理をさせることができる。

!注意
JDK1.6.0_20 までは、SwingWorker にバグがあるので注意。
Update21 で修正された。
バグの内容としては、SwingWorkerの終了を正確に取得できないことがある。

!例1
{{code Java,
  final JLabel label;
   class MeaningOfLifeFinder extends SwingWorker<String, Object> {
       @Override
       public String doInBackground() {
           return findTheMeaningOfLife();
       }

       @Override
       protected void done() {
           try { 
               label.setText(get());
           } catch (Exception ignore) {
           }
       }
   }
 
   (new MeaningOfLifeFinder()).execute();
}}

!例2
{{code Java,
 class PrimeNumbersTask extends 
         SwingWorker<List<Integer>, Integer> {
     PrimeNumbersTask(JTextArea textArea, int numbersToFind) { 
         //initialize 
     }

     @Override
     public List<Integer> doInBackground() {
         while (! enough && ! isCancelled()) {
                 number = nextPrimeNumber();
                 publish(number);
                 setProgress(100 * numbers.size() / numbersToFind);
             }
         }
         return numbers;
     }

     @Override
     protected void process(List<Integer> chunks) {
         for (int number : chunks) {
             textArea.append(number + "\n");
         }
     }
 }

 JTextArea textArea = new JTextArea();
 final JProgressBar progressBar = new JProgressBar(0, 100);
 PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
 task.addPropertyChangeListener(
     new PropertyChangeListener() {
         public  void propertyChange(PropertyChangeEvent evt) {
             if ("progress".equals(evt.getPropertyName())) {
                 progressBar.setValue((Integer)evt.getNewValue());
             }
         }
     });

 task.execute();
 System.out.println(task.get()); //prints all prime numbers we have got
}}
{{category2 プログラミング言語,Java}}