モジュール java.desktop

パッケージ javax.swing

すべてのプラットフォーム上で可能なかぎり同じように機能する軽量(Java共通言語)コンポーネントのセットを提供します。 これらのコンポーネントの使用方法に関するプログラマ向けガイドについては、『The Java Tutorial』のCreating a GUI with JFC/Swingを参照してください。 その他のリソースについては、関連ドキュメントを参照してください。

Swingのスレッド・ポリシー

通常、Swingはスレッドに対して安全ではありません。 すべてのSwingコンポーネントと関連クラスには、特に説明がないかぎり、イベント・ディスパッチ・スレッド上でアクセスしてください。

通常のSwingアプリケーションは、ユーザーのジェスチャによって生成されたイベントに応じて、処理を実行します。 たとえば、ユーザーがJButtonをクリックすると、JButtonに追加されたすべてのActionListenersに通知が送信されます。 ユーザーのジェスチャによって生成されたすべてのイベントはイベント・ディスパッチ・スレッド上でディスパッチされるので、開発者が制限の影響を受けることは、ほとんどありません。

ただし、Swingアプリケーションの構築時と表示時には影響があります。 イベント・ディスパッチ・スレッド上では、アプリケーションのmainメソッドの呼出しやApplet内のメソッドの呼出しは行われません。 このため、アプリケーションやアプレットの構築時および表示時には、イベント・ディスパッチ・スレッドに制御を渡していることを確認してください。 制御を渡し、Swingの処理を開始するためには、invokeLaterを使用することをお薦めします。 invokeLaterメソッドは、Runnableがイベント・ディスパッチ・スレッド上で処理されるようにスケジュールします。 次に、Swingアプリケーションに制御を渡し、Swingアプリケーションを起動する例を2つ示します。どちらの方法も適切です。

 import javax.swing.SwingUtilities;

 public class MyApp implements Runnable {
     public void run() {
         // Invoked on the event dispatching thread.
         // Construct and show GUI.
     }

     public static void main(String[] args) {
         SwingUtilities.invokeLater(new MyApp());
     }
 }
または:
 import javax.swing.SwingUtilities;

 public class MyApp {
     MyApp(String[] args) {
         // Invoked on the event dispatching thread.
         // Do any initialization here.
     }

     public void show() {
         // Show the UI.
     }

     public static void main(final String[] args) {
         // Schedule a job for the event-dispatching thread:
         // creating and showing this application's GUI.
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                 new MyApp(args).show();
             }
         });
     }
 }
この制約は、Swingコンポーネントに接続されたモデルにも適用されます。 たとえば、TableModelJTableに接続されている場合、TableModelの変更は必ずイベント・ディスパッチ・スレッド上で行うようにしてください。 別のスレッド上でモデルを変更した場合、例外が発生し、画面の表示が崩れる可能性があります。

すべてのイベントはイベント・ディスパッチ・スレッド上で配信されるので、イベント処理時に注意してください。 特に、イベント・ディスパッチ・スレッド上で、ネットワーク入出力や計算量の多い処理など、時間のかかるタスクを実行すると、その他のイベントのディスパッチがブロックされます。 イベント・ディスパッチ・スレッドがブロックされている間、アプリケーションはユーザーの入力に一切反応しなくなります。 Swingの使用時にこのような処理を実行する場合は、SwingWorkerの説明に従うことをお勧めします。

このトピックの詳細は、『The Swing Tutorial』(特に Concurrency in Swingのセクション)を参照してください。

関連項目

概要、チュートリアル、例、ガイド、その他のマニュアルについては、次を参照してください。