これは簡単ではないかもしれませんが、私は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クローズド、欠陥ではない)とほぼ同じ例外を導いていると思う。
おかげさまで、私たちはあなたの答えをほぼすべての場所で書きました。コードがswingworkerを使用するいくつかの領域があります。そのような場合でも、処理はGUIアクセスと非GUI部分に分割することができます。 – Jayan
スプリット・ライトを行うと、通常パフォーマンスが向上し、問題を回避できるため、強くお勧めします。 –
@Jayanチュートリアルはpublish/process/doneからの出力について話していますが、if(isEventDispatchThread)を試してみてください。http://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from-future-and-swingworker- if-threa。 +1 – mKorbel