2012-01-24 10 views
7

これは簡単ではないかもしれませんが、私はSwingWorkerの簡単なドキュメントを理解するのに苦労しています。java SwingWorker.doInBackground()はGUI要素にアクセスしてはならない

現在のスレッド::execute()メソッドは、この上で呼び出された。ここ

は、コピー貼り付け、コンテンツ

ワークフロー

SwingWorkerのライフサイクルに関わる3件のスレッドがあります。です糸。 はワーカースレッド上での実行のためにSwingWorkerをスケジューリングし、すぐに を返します。 SwingWorkerが のgetメソッドを使用して完了するのを待つことができます。

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

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

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

-

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

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

答えて

11

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

Runnableの変化をラップし、それらをSwingUtilities.invokeAndWaitSwingUtilities.invokeLater又は介してEDTに実行された - SwingWorkerを使用する場合 - publish介して(doInBackgroundから)。 EDTによって実行されるメソッドSwingWorkerの中で、GUIにアクセスすることができます。

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

個人的に、私は多くの状況のた​​めに使いやすくinvokeLaterinvokeAndWaitを見つけます。 SwingWorkerは大丈夫です。プログレスバー。

+0

おかげさまで、私たちはあなたの答えをほぼすべての場所で書きました。コードがswingworkerを使用するいくつかの領域があります。そのような場合でも、処理はGUIアクセスと非GUI部分に分割することができます。 – Jayan

+0

スプリット・ライトを行うと、通常パフォーマンスが向上し、問題を回避できるため、強くお勧めします。 –

+0

@Jayanチュートリアルはpublish/process/doneからの出力について話していますが、if(isEventDispatchThread)を試してみてください。http://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from-future-and-swingworker- if-threa。 +1 – mKorbel

関連する問題