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

MyMemoWiki

「Java Swing 非同期処理の結果をGUIに表示する」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==Java Swing 非同期処理の結果をGUIに表示する== [Java]{{category 並行処理}} *イベントディスパッチスレッド ===SwingWorkerを利用する=…」)
 
 
(同じ利用者による、間の2版が非表示)
1行目: 1行目:
==Java Swing 非同期処理の結果をGUIに表示する==
+
==[[Java Swing 非同期処理の結果をGUIに表示する]]==
[Java]{{category 並行処理}}
+
[[Java]] | [[Category:並行処理]]
*イベントディスパッチスレッド
+
*[[イベントディスパッチスレッド]]
===SwingWorkerを利用する===
+
===[[Swing]]Workerを利用する===
 
*[http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/SwingWorker.html SwingWorker]
 
*[http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/SwingWorker.html SwingWorker]
 
====呼出例====
 
====呼出例====
9行目: 9行目:
 
  LogAnalyzeWorker worker = new LogAnalyzeWorker(txtOut, logs); // txtOut : JTextArea
 
  LogAnalyzeWorker worker = new LogAnalyzeWorker(txtOut, logs); // txtOut : JTextArea
 
  worker.execute();
 
  worker.execute();
  List<String> result = worker.get();
+
  List&lt;String&gt; result = worker.get();
 
====実行例          ====
 
====実行例          ====
  public static class LogAnalyzeWorker extends SwingWorker<List<String>, String> {
+
  public static class LogAnalyzeWorker extends [[Swing]]Worker&lt;List&lt;String&gt;, String&gt; {
 
     private File[] logs;
 
     private File[] logs;
 
     private JTextArea txtOut;
 
     private JTextArea txtOut;
21行目: 21行目:
 
      
 
      
 
     @Override
 
     @Override
     protected List<String> doInBackground() throws Exception {
+
     protected List&lt;String&gt; doInBackground() throws Exception {
         List<String> result = new ArrayList<String>();
+
         List&lt;String&gt; result = new ArrayList&lt;String&gt;();
 
         for (File log : logs) {
 
         for (File log : logs) {
 
             publish(log.getName()); // process() で取得できる処理状態の情報を返す
 
             publish(log.getName()); // process() で取得できる処理状態の情報を返す
28行目: 28行目:
 
              
 
              
 
             // 時間がかかる処理本体
 
             // 時間がかかる処理本体
             LogAnalyzer analyzer = new AccessLogAnalyzer();
+
             LogAnalyzer analyzer = new [[Access]]LogAnalyzer();
 
             analyzer.analyze(log);
 
             analyzer.analyze(log);
 
         }
 
         }
36行目: 36行目:
 
   
 
   
 
     @Override
 
     @Override
     protected void process(List<String> chunks) {
+
     protected void process(List&lt;String&gt; chunks) {
 
         // publish() で設定した内容がリストで取得できるので、GUIに書き出す
 
         // publish() で設定した内容がリストで取得できるので、GUIに書き出す
 
         for (String logout : chunks) {
 
         for (String logout : chunks) {

2020年2月16日 (日) 04:27時点における最新版

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