Swing

Swingの部品を使用したウィンドウの例
は、プログラミング言語 Java のGUIツールキットである。Oracle社のJava Foundation Classesの一部であり、同じくJavaの GUI ツールキットである AWT を拡張したもの。Javaプログラムにグラフィカルユーザインタフェース(GUI)を提供するAPIである。
Swingは、先行するAWTよりも洗練されたGUIコンポーネントを提供するために開発された。Swingは、幾つかのプラットフォームのルック・アンド・フィールをエミュレートしたネイティブなルック・アンド・フィールを提供する。また、「プラグイン可能なルック・アンド・フィール」(Pluggable look and feel)をサポートしていることにより、アプリケーションは簡単にルック・アンド・フィールを切り替えることができ、下で走っているプラットフォームとは関係ないルック・アンド・フィールを使うこともできる。SwingはAWTよりも強力で柔軟なコンポーネントを持つ。ボタン、チェックボックス、ラベルといった馴染み深いコンポーネントの他にも、Swingはタブ付きパネル、スクロール窓、スライダー、スピナ、ツリー表示、表、リストなどの高度なコンポーネントを提供している。
AWTと異なり、Swingコンポーネントはプラットフォーム固有のコードで実装されたものではなく、完全にJavaで書かれている。このため、Swingはプラットフォームに依存しない。このようなコンポーネントを軽量コンポーネントと呼ぶ。AWT はオペレーティングシステムのウィンドウシステムに準じたデザインになるのに対し、Swing で作成した GUI は Javaプログラム上で描画されるので、より柔軟な設計が可能となる。
SwingはJavaFXにより置き換えられる方針であるが、当面の将来はSwingもJava SE仕様の一部として残る見込みである。

**アーキテクチャ**
Swingは、Java言語用の、プラットフォームに依存しない、 "Model View Controller"型の GUIフレームワークであり、単一スレッドプログラミング・モデルに従っている。更に、このフレームワークはコード構造とSwingベースのGUIのグラフィック表現の間に抽象化層を提供する。

**基礎**
Swingは完全にJavaで書かれているためプラットフォームに依存しない。全てのSwingクラスに関する完全なドキュメントが Java API Guide（バージョン6用）または Java Platform Standard Edition 8 API Specification（バージョン8用）にある。

**拡張性**
Swingは高度にモジュール・ベースのアーキテクチャである。これによりフレームワークのインターフェイスに様々なカスタム実装を「差し込む」ことができる。ユーザはJavaの継承の仕組みを使って、デフォルト実装をオーバーライドして、これらのコンポーネントに独自のカスタム実装を作ることができる。
Swingはコンポーネント・ベースのフレームワークである。そのコンポーネント群は全て究極的にはjavax.swing.JComponentクラスから派生したものである。Swingのオブジェクト群は非同期的にイベントを発出し、それぞれがプロパティ群を持ち、各コンポーネントに固有のメソッド呼び出しに対応する。SwingコンポーネントはJavaBeansコンポーネントであり、Java Beans Component Architecture仕様に準拠している。

**設定可能**
Swingはランタイム機構と間接的構成パターンに大きく依存しているため、その設定値が実行中に根本的に変わっても対応できるようになっている。たとえば、Swingベースの、実行中のアプリケーションのユーザー・インターフェイスをホットスワップ可能である。更に、ユーザが独自のルック・アンド・フィールの実装を与えることもでき、これにより、アプリケーションのコードは何も変更することなく、既存のSwingアプリケーションのルック・アンド・フィールを均質に変更することが可能となっている。
 軽量UI:
Swingの高水準の柔軟性は、ネイティブ・ホストのオペレーティング・システム (OS)のGUI部品の表示をオーバーライドできる能力を反映したものである。Swingは、そのGUI部品をJava 2D API群で描画しており、ネイティブなユーザー・インターフェイス・ツールキットを呼ばない。従ってSwingコンポーネントには、それに対応するネイティブなOSのGUIコンポーネントといったものはなく、下層にあるグラフィクスGUIで可能な範囲内においてどのように描画しようと自由である。
しかしながら、すべてのSwingコンポーネントは、その中核部分においてAWT コンテナに依存している。これは、SwingのJComponent はAWTのContainerを拡張したものだからである。これによりSwingをホストOSのGUI管理フレームワーク（デバイスとスクリーンの対応づけや、キー操作やマウス移動などユーザとのインタラクションを含む）に差し込むことが可能になっている。Swingは単純に、Swing固有の(OSにとらわれない）意味(semantics)を、下層にある(OS固有の)コンポーネント群に「置き換え」ているだけである。従って、たとえば、全てのSwingコンポーネントは、(AWTの)Containerで定義されたcomponent.paint()の呼び出しに応じて、自身をグラフィック・デバイスに描画する。しかし、その描画をOS固有の「重い」(heavy weight)ウィジェットに委任するAWTコンポーネントとは異なり、Swingコンポーネントは自身の描画は自分の責任として行う。
この「置き換え」(transposition)と「切り離し」(decoupling)は単に目に見える部分だけのことではなく、そのコンポーネント包含階層内で発出されるイベントにおけるOS非依存の意味(semantics)の管理と応用にもいえることである。一般的にいって、Swingアーキテクチャは、OSのGUIが持っている意味に対して与えられた様々な表現形式を、単純ではあるが一般化されたパターンに対応づける仕事をAWTコンテナに委任している。その一般化されたプラットフォーム上で構築すれば、JComponentモデルの形でリッチで複雑なGUIの意味(semantics)を組み上げたことになる。

**プログラム例**
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class HelloWorld implements Runnable {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new JLabel("Hello, world!"));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String args) {
HelloWorld hello = new HelloWorld();
SwingUtilities.invokeLater(hello);
}
}

**歴史**
1998年にリリースされた J2SE 1.2 で初めてリリースされた。
*2002年にリリースされた J2SE 1.4 で提供された Java Web Start を利用することでプログラムの再配布の問題を解決した。
*2004年にリリースされた Java SE 1.5 でメモリ消費効率の改善を行った。
*2006年にリリースされた Java SE 6 では Java の実行性能が改善されたことによって Swing の実行性能も改善された。

**関連項目**
レイアウトマネージャ
*lang|en|Abstract Window Toolkit
*lang|en|Standard Widget Toolkit
*JavaFX

**脚注**

**外部リンク**
javax/swing