2011-01-21 16 views
7

私は現在Swingを学んでいますが、一般的にはGUI開発の初心者です。私のテストアプリケーションでは、単一のイベントソースに対して複数のイベントリスナーを持っています。これらのイベントリスナのどれが最初に実行されるのか不思議です。Java Swingシングルスレッド環境の単一イベントソース用の複数のイベントリスナー

また、シングルスレッド環境でSwingイベント処理がどのように機能するのか、特に単一のイベントソースに対して複数のリスナーがある場合は、興味があります。

最後に、Swingで複数のスレッドを使用する必要のある一般的なケースを知りたいと思います。

ありがとうございます!

答えて

12

私は3つすべての質問に答えようとします。まず第一に、火災が指定されていない秩序。誰かが発射する特定の命令を決して受け入れるべきではありません。特定の順序でアクションが必要な場合は、同じActionListenerに入れてください。

スイングをプログラミングするときは、ほとんど常にマルチスレッド環境になります。 Event Dispatch Thread(EDT)と呼ばれるスレッドが1つあります。これはすべてのイベントを処理するスレッドです。他の処理は別のスレッドで行う必要があります。そうしないと、Swing GUIが応答しなくなる可能性があります。

Swingの複数のスレッドの一般的なケースは、処理に時間がかかる場合があります。 (激しい計算、IO、データベース接続)あなたはEDTとは別のスレッドで頑張りたいと思うでしょう。それはあなたのGUIを応答し続けるでしょう。

Oracleネットワークには、Swingの並行性に関する優れたチュートリアルがあります。 check it outをお勧めします。

スレッドの以下の種類のスイングプログラマのお得な情報:

  • 初期スレッド、最初のアプリケーションのコードを実行するスレッド。
  • すべてのイベント処理コードが実行されるイベントディスパッチスレッド。 Swingフレームワークとやり取りするほとんどのコードもこのスレッドで実行する必要があります。
  • 時間のかかるバックグラウンドタスクが実行されるワーカースレッド(バックグラウンドスレッドとも呼ばれます)。

スイングにおける任意のマルチスレッド質問に対する標準的な答えは、SwingWorkerを使用することです。これにより、EDTと別のスレッドでバックグラウンド作業を簡単に調整することができます。いつものように、Oracleにはgreat tutorial on how to use SwingWorkerがあります。

+1

私はSwingWorkerの直接の言及が間違っていますが、それ以外は非常に良い答えです。 – extraneon

+0

@extraneon:yes 'SwingWorker'はSwingのマルチスレッドへの標準的な答えです。私は最後にそれに素早く叫び声を加えます。 – jjnguy

+2

デザインの観点からは、設定された順序で実行可能な他のActionListener(または別のクラス)を登録できるActionListenerを作成することができます。 – extraneon

関連する問題