| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

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

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

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

Java |

SwingWorkerを利用する

呼出例

  • バッググラウンドで複数のログファイルを処理するシナリオ
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");
        }
    }
}