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

Java Swing 非同期処理の結果をGUIに表示するの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Java Swing 非同期処理の結果をGUIに表示する
[Java]{{category 並行処理}}
*イベントディスパッチスレッド
!!SwingWorkerを利用する
*[SwingWorker|http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/SwingWorker.html]
!呼出例
*バッググラウンドで複数のログファイルを処理するシナリオ
 File[] logs = chooser.getSelectedFiles();
 LogAnalyzeWorker worker = new LogAnalyzeWorker(txtOut, logs); // txtOut : JTextArea
 worker.execute();
 List<String> result = worker.get();
!実行例           
 public static class LogAnalyzeWorker extends SwingWorker<List<String>, String> {
     private File[] logs;
     private JTextArea txtOut;
     
     public LogAnalyzeWorker(JTextArea txtOut, File[] logs) {
         this.logs = logs;
         this.txtOut = txtOut; // 結果表示先
     }
     
     @Override
     protected List<String> doInBackground() throws Exception {
         List<String> result = new ArrayList<String>();
         for (File log : logs) {
             publish(log.getName()); // process() で取得できる処理状態の情報を返す
             result.add(log.getName());
             
             // 時間がかかる処理本体
             LogAnalyzer analyzer = new AccessLogAnalyzer();
             analyzer.analyze(log);
         }
         // get() で取得できる結果を返す
         return result;
     }
 
     @Override
     protected void process(List<String> chunks) {
         // publish() で設定した内容がリストで取得できるので、GUIに書き出す
         for (String logout : chunks) {
             txtOut.append(logout + "\n");
         }
     }
 }