7

これは些細なことかもしれませんが、SwingWorkerに関する簡単なドキュメントを理解するのに苦労しています。

コピペした内容はこちら

ワークフロー

SwingWorker のライフサイクルには、次の 3 つのスレッドが関係しています。

現在のスレッド: このスレッドで execute() メソッドが呼び出されます。ワーカースレッドでの実行のために SwingWorker をスケジュールし、すぐに戻ります。get メソッドを使用して SwingWorker が完了するのを待つことができます。

ワーカー スレッド: doInBackground() メソッドがこのスレッドで呼び出されます。これは、すべてのバックグラウンド アクティビティが発生する場所です。バインドされたプロパティの変更について PropertyChangeListeners に通知するには、firePropertyChange および getPropertyChangeSupport() メソッドを使用します。デフォルトでは、state と progress の 2 つのバインドされたプロパティを使用できます。

イベント ディスパッチ スレッド: Swing 関連のすべてのアクティビティは、このスレッドで発生します。SwingWorker は process メソッドと done() メソッドを呼び出し、このスレッドのすべての PropertyChangeListeners に通知します。

多くの場合、現在のスレッドはイベント ディスパッチ スレッドです。

--

ワーカー スレッドは EDT ではないため、doInBackground() のコードは GUI 要素にアクセスしてはなりません。私の理解は正しいですか?

背景: SwingWorker を使用する小さなコードがありますが、doInBackground() で FileChooser を作成し、setCurrentDirectory(). http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181 (11-クローズド、欠陥ではありません)とほぼ同じ例外が発生していると思われます 。

4

1 に答える 1

13

はい。バックグラウンド スレッドから - 通常のスレッドと、SwingWorker.doInBackgroundさまざまなトラブルを避けるために UI を変更しないでください。

代わりに、変更を a でラップし、または(使用する場合は)経由でRunnableEDT で実行します。EDT によって実行されるのメソッド内で、GUI にアクセスできます。SwingUtilities.invokeAndWaitSwingUtilities.invokeLaterSwingWorkerpublishdoInBackgroundprocessSwingWorker

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

個人的には、多くの状況で使いやすくなっていますinvokeLaterinvokeAndWaitSwingWorker は、プログレス バーなどには問題ありません。

于 2012-01-24T07:55:15.297 に答える