1

EDT で実行される数百の異なる関数があります。それらの多くには長時間実行されるタスクが含まれており、一部には GUI の変更が含まれています。ときどき GUI がハングすることがありますが、GUI のハングが同じ領域で 100% 発生するわけではないため、これが発生するすべての場所を追跡するのは困難です。ハングは通常、ウィンドウの最小化/最大化の後に機能し始めるため、問題の優先度は高くありませんが、最終的には実行する必要があります。

いくつかの調査の結果、SwingWorkerの下で doInBackground() を使用して、労働集約型の作業を行うメソッドに使用し、done() を GUI 描画に使用できることを発見しました。また、たまたま doInBackground() 関数にあるすべての GUI 描画にSwingUtilities.invokeLaterを使用できると思います。ただし、コード内の何百もの関数をすべて調整することは避けたいと考えています。

単一の SwingWorker を使用して、実行時間の長いメソッドを doInBackground() 関数に送信する方法はありますか? SwingWorker が使用される GUI コードが間違って配置されるたびに、invokeLater 関数を複数回使用することはそれほど頻繁ではないため、問題ではありません。

これが不可能な場合、使用できる代替手段はありますか? ありがとうございました。

4

2 に答える 2

2

GUI を更新するすべてのメソッドは EDT で呼び出す必要があります。そうしないと、説明のつかない GUI の動作が発生する可能性があります (実際に表示されているように聞こえます)。適切に行われない再描画、スレッド レースなどが発生する可能性があります。

GUI が応答しなくなるため、GUI で実行時間の長いタスクを実行することはお勧めしません。したがって、実行時間の長いタスクでは、SwingWorker を使用することをお勧めします (process メソッドと done メソッドは EDT で自動的に呼び出されることに注意してください。ワーカーは doInBackground で長時間実行される作業を実行できますが、done メソッドから SwingUtilities.invokeLater を使用せずに安全に GUI を更新できます)。

あなたが言及したように、何百ものメソッドがあり、毎回 SwingUtilities.invokeLater を呼び出したくない場合は、タスク フレームワークの 1 つを調べることをお勧めします。Swing Application Framework は、JSR-296 http://java.sun.com/developer/technicalArticles/javase/swingappfr/の下で開発されましたが、積極的にサポートされていませんが、優れたフレームワークを提供しています。 http://en.wikipedia.org/wiki/Swing_Application_Frameworkは、代替フレームワークのリストです。

アプリケーションを大幅に書き直す必要があるようです。EDT の外部から GUI メソッドを呼び出すことは安全ではありません。

于 2012-05-28T15:55:01.960 に答える