10

SwingWorker次の目的で使用されます。

  • GUI が応答しなくなるのを防ぐために、別のスレッドで実行時間の長いタスクを実行するため
  • メソッドを介してタスクの最後に長時間実行タスクによって生成された結果で GUI を更新しますdone()
  • publish()およびメソッドを使用して、タスクによって生成および公開された中間結果を使用して、GUI を随時更新しprocess()ます。

SwingUtilities.invokeLater()上記のタスクを次のように実行できます。

  • SwingWorker.execute()EDT からメソッドを実行する代わりに、ExecutorService.submit(new MyRunnable())長時間実行されるタスクを実行できる別のスレッドも作成されるため、実行できます。
  • タスクの最後に GUI を更新するために、コード ( done()case1 のメソッドで記述)をタスクの最後に置くことができSwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())ます。
  • タスクの途中で GUI を更新するには、 case1 のメソッドを呼び出した場所にコード ( process()case1 のメソッドに記述)を配置します。SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())publish()

質問Java - SwingWorker - EDTの代わりに他のSwingWorkerから1つのSwingWorkerを呼び出すことができますかで指定された問題は解決できますが、解決SwingUtilities.invokeLater()できないため、この質問をしていますSwingWorker

4

2 に答える 2

7

SwingWorkerはヘルパー クラスです。使用する必要があるわけではありませんが、同じ作業を手作業で行うよりも、使用する方がはるかに簡単で明確です。(進行状況の確認も簡単になります。) バージョン 6 で追加されたことに注意してください。それ以前は、Swing チュートリアルで定義されたより単純なクラスを使用したり、あなたが指摘したものと同様の手順を実行したりする人もいました。

于 2010-05-13T18:59:41.940 に答える
1

1.6+ SwingWorker クラスの重要な機能は、doInBackground() と done() の間の EDT (イベント ディスパッチ スレッド) の違いです。doInBackground() を doWorkOutsideEDT() と、done() を doWorkInsideEDT() と考える必要があります。この説明用の例を実行して、違いを確認してください。

    System.out.println("TID=" + Thread.currentThread().getId() + " (main)");
    final SwingWorker<String, String> x = new SwingWorker<String, String>() {
        @Override
        protected String doInBackground() throws Exception {
            final long tid = Thread.currentThread().getId();
            System.out.println("");
            System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread());
            System.out.println("Long running code goes here.");
            return "";
        }

        @Override
        protected void done() {
            final long tid = Thread.currentThread().getId();
            System.out.println("");
            System.out.println("TID=" + tid + "          done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread());
            System.out.println("GUI updates/changes go here.");
        }
    };
    x.execute();
    x.get();

出力:

TID=1 (main)

TID=9 doInBackground() isEventDispatchThread=false
Long running code goes here.

TID=16          done() isEventDispatchThread=true
GUI updates/changes go here.
于 2014-05-16T14:03:44.243 に答える