
Abstract Window Toolkit ( AWT ) は、 Swingより前に登場した、 Javaのプラットフォーム依存のウィンドウ、グラフィックス、およびユーザーインターフェイスウィジェットツールキットです。AWT は、Java プログラムにグラフィカルユーザーインターフェイス(GUI)を提供する標準APIであるJava Foundation Classes (JFC)の一部です。 [ 1 ] AWT は、多数のJava MEプロファイルの GUI ツールキットでもあります。たとえば、Connected Device Configurationプロファイルでは、携帯電話のJavaランタイムがAbstract Window Toolkit をサポートしている必要があります。
Sun Microsystemsが1995年にJavaを初めてリリースしたとき、AWTウィジェットは基盤となるネイティブユーザーインターフェイスに対して薄いレベルの抽象化を提供しました。たとえば、AWTチェックボックスを作成すると、AWTはチェックボックスを作成した基盤となるネイティブサブルーチンを直接呼び出します。しかし、WindowsのチェックボックスはmacOSや各種Unixのチェックボックスとは異なります。一部のアプリケーション開発者は、基盤となるネイティブウィンドウツールキットへの高い忠実度とネイティブアプリケーションとのシームレスな統合を提供するため、このモデルを好みます。つまり、AWTを使用して記述されたGUIプログラムは、Windowsで実行するとネイティブのMicrosoft Windowsアプリケーションのように見えますが、同じプログラムはMacで実行するとネイティブのApple Macintoshアプリケーションのように見えます。しかし、アプリケーションがすべてのプラットフォームでまったく同じように表示されることを好む一部のアプリケーション開発者は、このモデルを好みません。
J2SE 1.2では、Swingツールキットが AWT のウィジェットをほぼ完全に置き換えました。Swing は、より豊富な UI ウィジェットを提供するだけでなく、オペレーティングシステムの高レベルなユーザー インターフェイス モジュールに依存するのではなく、 Java 2Dを使用してローカル グラフィックス サブシステムの低レベル サブルーチンを呼び出すことで、独自のウィジェットを描画します。Swing では、ネイティブ プラットフォームの「ルック アンド フィール」を使用するか、すべてのウィンドウ システムで同じように見えるクロス プラットフォームのルック アンド フィール (「Java ルック アンド フィール」) を使用するかを選択できます。
AWTは2つのレベルのAPIを提供します。
java.awt.datatransferのパッケージ。CanvasAWTは、アプリケーションに対して以下のようなより高度な機能も提供します。
AWTもSwingも、本来スレッドセーフではありません。そのため、GUIを更新したりイベントを処理したりするコードは、イベントディスパッチスレッドで実行する必要があります。そうしないと、デッドロックや競合状態が発生する可能性があります。この問題を解決するために、 SwingWorkerというユーティリティクラスが用意されており、アプリケーションはユーザー操作イベントに続いて、イベントディスパッチスレッドで時間のかかるタスクを実行できます。
AWTコンポーネントにSwingバージョンが存在する場合、それは「J-」で始まり、AWTバージョンを置き換えてSwingバージョンのみを使用する必要があります。たとえば、SwingではJButtonのみを使用し、Buttonクラスは使用しないでください。前述のとおり、ColorやFontなどのAWTコアクラスは、Swingでもそのまま使用できます。
Swingで描画する場合は、AWTのpaint()メソッドを使用する代わりに、JPanelを使用してpaintComponent(Graphics g)メソッドをオーバーライドしてください。
Java 6 Update 12より前は、Swingコンポーネントと基本的な AWT ウィジェットを混在させると、定義されたz-orderに関係なく AWT ウィジェットが Swing ウィジェットの上に表示されてしまうという望ましくない副作用が発生することがよくありました。この問題は、Swing がAWT からヘビーウェイトのトップコンテナを借用しているにもかかわらず、2 つのウィジェットツールキットのレンダリングアーキテクチャが大きく異なっていたためです。 [ 2 ]
Java 6 Update 12以降では、zオーダーの問題なくSwingウィジェットとAWTウィジェットを混在させることが可能です。[ 3 ]
パッケージorg.wikipedia.examples ;import java.awt.Frame ; import java.awt.Label ; import java.awt.event.WindowAdapter ; import java.awt.event.WindowEvent ;public class MyApp {public static void main ( String [] args ) { Frame frame = new Frame ( "Application" ); frame . add ( new Label ( "Hello!" )); frame . setSize ( 500 , 500 ); frame . setLocationRelativeTo ( null ); // ウィンドウを中央に配置するframe . addWindowListener ( new WindowAdapter () { @Override public void windowClosing ( WindowEvent e ) { frame . dispose (); // ネイティブスクリーンリソースを解放する} }); frame . setVisible ( true ); } }AWTは基盤となるネイティブのユーザーインターフェースへの橋渡しとなるため、新しいオペレーティングシステム上での実装には多くの作業が必要となる可能性があります。特に、AWTのGUIウィジェットが関係する場合はなおさらです。なぜなら、それぞれのウィジェットは、対応するネイティブのウィジェットをゼロから開発する必要があるからです。
新しいプロジェクト Caciocavallo が作成され、新しいシステムでの AWT 実装を容易にするOpenJDKベースの Java API が提供されています。 [ 4 ] [ 5 ]このプロジェクトは、 Java2Dを使用して AWT ウィジェットを正常に実装しました。[ 6 ]その後、必要なすべての core-JDK の変更がOpenJDK 7にプッシュされました。[ 7 ]これにより、外部ライブラリを含め、いくつかのシステム プロパティを設定することで、公式 JDK ( X Window System、OpenGL、DirectX ) が提供するもの以外のグラフィックス スタックで Java を使用できるようになりました。CaciocavalloのDirectFBバックエンド[ 8 ]とHTML5バックエンドが開発中です。目標は、Java サポートのない既存の Swing アプリケーションを、Web サーバー上で実行される通常の Web アプリケーションとして展開することです。[ 8 ] [ 9 ]
最新のFontManagerプッシュにより、これらのパッチはもう必要ありません。すべてが上流にプッシュされたので、Cacioリポジトリを使用するだけで、完全に自己完結しています。
java.awt(AWT Javadoc APIドキュメント)