Swing(Java)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
JavaでのSwingウィジェットの例

Swingは、Java用のGUI ウィジェットツールキットです。[1]これは、OracleJava Foundation Classes(JFC)の一部です。これは、Javaプログラムにグラフィカルユーザーインターフェイス(GUI)を 提供するためのAPIです。

Swingは、以前のAbstract Window Toolkit(AWT)よりも洗練されたGUIコンポーネントのセットを提供するために開発されました。Swingは、複数のプラットフォームのルックアンドフィールをエミュレートするルックアンドフィールを提供し、アプリケーションが基盤となるプラットフォームとは無関係のルックアンドフィールを持つことを可能にするプラグイン可能なルックアンドフィールもサポートします。AWTよりも強力で柔軟なコンポーネントがあります。Swingには、ボタン、チェックボックス、ラベルなどの使い慣れたコンポーネントに加えて、タブ付きパネル、スクロールペイン、ツリー、テーブル、リストなどの高度なコンポーネントがいくつか用意されています。[2]

AWTコンポーネントとは異なり、Swingコンポーネントはプラットフォーム固有のコードによって実装されません。代わりに、それらは完全にJavaで記述されているため、プラットフォームに依存しません。

2008年12月、Sun Microsystems(Oracleの前身)は、 JavaFXと呼ばれるSwingの後継となることを目的としたCSS / FXMLベースのフレームワークをリリースしました。[3]

歴史

Internet Foundation Classes(IFC)は、元々 Netscape Communications Corporationによって開発され、1996年12月16日に最初にリリースされたJava用のグラフィックライブラリでした。 1997年4月2日、 SunMicrosystemsNetscapeCommunications Corporationは、IFCを他のテクノロジに組み込む意向を発表しました。JavaFoundationクラスを形成します[4]「JavaFoundationClasses」は、後に「Swing」に名前が変更されました。

Swingは、アプリケーションコードに大幅な変更を加えることなく、アプリケーション内のすべてのコンポーネントのルックアンドフィールを変更できるメカニズムを導入しました。プラグ可能なルックアンドフィールのサポートの導入により、Swingコンポーネントは、プラットフォームに依存しないという利点を維持しながら、ネイティブコンポーネントの外観をエミュレートできます。もともとは個別にダウンロード可能なライブラリとして配布されていましたが、リリース1.2以降、SwingはJava StandardEditionの一部として含まれています。[5] Swingクラスとコンポーネントはjavax.swing パッケージ階層に含まれています。

Swingの後継であるJavaFXの開発は2005年に開始され、2年後のJavaOne2007で正式に導入されました。[6] JavaFXは2011年にオープンソースになり、2012年にOracleJDKダウンロードの一部になりました。JavaFXは、軽量化、 CSSスタイリング、洗練されたデザインコントロール、FXMLとScene Builderの使用など、いくつかの利点によりSwingに取って代わりつつあります。[7] 2018年、JavaFXは、開発のペースを上げるために、OpenJFXプロジェクトの下でOpenJDKの一部になりました。[8]

Swingを担当したJavaクライアントチームのメンバーには、James Gosling(アーキテクト)、Rick Levenson(マネージャー)、Amy Fowler&Hans Muller(共同技術リーダー)、Tom Ball、Jeff Dinkins、Georges Saab、[9] TimPrinzingが含まれていました。 、Jonni Kanerva、およびJeannette Hung&Jim Graham(2Dグラフィックス)。[10]

アーキテクチャ

Swingは、プラットフォームに依存しないJava用の「モデル-ビュー-コントローラーGUIフレームワークであり、シングルスレッドプログラミングモデルに従います。[11]さらに、このフレームワークは、SwingベースのGUIのコード構造とグラフィック表示の間に抽象化レイヤーを提供します。

基礎

Swingは完全にJavaで記述されているため、プラットフォームに依存しません。すべてのSwingクラスの完全なドキュメントは、バージョン6のJavaAPIガイドまたはバージョン8のJavaPlatform Standard Edition 8API仕様にあります。

拡張可能

Swingは高度にモジュールベースのアーキテクチャであり、指定されたフレームワークインターフェイスのさまざまなカスタム実装の「プラグイン」を可能にします。ユーザーは、を介してJavaの継承メカニズムを使用して、デフォルトの実装をオーバーライドするこれらのコンポーネントの独自のカスタム実装を提供できますjavax.swing.LookAndFeel

Swingはコンポーネントベースのフレームワークであり、そのコンポーネントはすべて最終的にクラスから派生しjavax.swing.JComponentます。Swingオブジェクトは非同期でイベントを発生させ、バインドされたプロパティを持ち、コンポーネントに固有のドキュメント化された一連のメソッドに応答します。SwingコンポーネントはJavaBeansコンポーネントであり、 JavaBeans仕様に準拠しています。

構成可能

Swingは、実行時メカニズムと間接的な構成パターンに大きく依存しているため、実行時に設定の基本的な変更に対応できます。たとえば、Swingベースのアプリケーションは、実行時にユーザーインターフェイスをホットスワップできます。さらに、ユーザーは独自のルックアンドフィール実装を提供できます。これにより、アプリケーションコードをプログラムで変更することなく、既存のSwingアプリケーションのルックアンドフィールを均一に変更できます。

軽量UI

Swingの高いレベルの柔軟性は、ネイティブホストオペレーティングシステム(OS)のGUIコントロールをオーバーライドしてそれ自体を表示する固有の機能に反映されています。Swingは、ネイティブユーザーインターフェイスツールキットを呼び出すのではなく、Java 2DAPIを使用してコントロールを「ペイント」します。したがって、Swingコンポーネントには対応するネイティブOS GUIコンポーネントがなく、基盤となるグラフィックGUIで可能な方法で自由にレンダリングできます。

ただし、 (Swingの)コンテナは(AWTの)コンテナを拡張するため、基本的に、すべてのSwingコンポーネントはAWTコンテナに依存しています。JComponentこれにより、Swingは、重要なデバイス/画面マッピングや、キーの押下やマウスの動きなどのユーザー操作を含む、ホストOSのGUI管理フレームワークにプラグインできます。Swingは、基盤となる(OS固有の)コンポーネントに対して、独自の(OSに依存しない)セマンティクスを単純に「転置」します。したがって、たとえば、すべてのSwingコンポーネントは、(AWT)Containerで定義されているcomponent.paint()の呼び出しに応答して、そのレンディションをグラフィックデバイスにペイントします。ただし、OSネイティブの「ヘビーウェイト」ウィジェットにペイントを委任したAWTコンポーネントとは異なり、Swingコンポーネントは独自のレンダリングを担当します。

この転置とデカップリングは単なる視覚的なものではなく、Swingの管理と、コンポーネントの包含階層内で発生したイベントに対する独自のOSに依存しないセマンティクスの適用にまで及びます。一般的に、Swingアーキテクチャーは、OS GUIセマンティクスのさまざまなフレーバーを、単純であるが一般化されたパターンにAWTコンテナーにマッピングするタスクを委任します。その一般化されたプラットフォーム上に構築され、JComponentモデルの形で独自のリッチで複雑なGUIセマンティクスを確立します。

緩く結合されたMVC

Swingライブラリは、モデル-ビュー-コントローラーソフトウェアデザインパターン[12]を多用します。これは表示されているデータを、表示されているユーザーインターフェイスコントロールから概念的に切り離します。このため、ほとんどのSwingコンポーネントには、関連付けられたモデルがあります(Javaインターフェイスで指定されます)。)、およびプログラマーはさまざまなデフォルトの実装を使用するか、独自の実装を提供できます。フレームワークは、そのすべての具象コンポーネントのモデルインターフェイスのデフォルトの実装を提供します。JComponentSwingフレームワークは、デフォルトでSwingライブラリの対応する子クラスに関連付けられた一連のデフォルトの実装を透過的に提供するため、Swingフレームワークの通常の使用ではカスタムモデルを作成する必要はありません。一般に、テーブル、ツリー、場合によってはリストなどの複雑なコンポーネントのみが、アプリケーション固有のデータ構造に関するカスタムモデルの実装を必要とする場合があります。Swingアーキテクチャが可能にする可能性を十分に理解するために、テーブルとリストのカスタムモデルがDAOEJBサービス。

通常、Swingコンポーネントモデルオブジェクトは、発生したイベントを定義する簡潔なインターフェイスと、関連するJComponentで使用するための(概念的な)データモデルのアクセス可能なプロパティを提供する役割を果たします。全体的なMVCパターンが緩く結合された協調オブジェクト関係パターンであるとすると、モデルは、イベントリスナーをデータモデルオブジェクトにアタッチするためのプログラム的な手段を提供します。通常、これらのイベントはモデル中心であり(例:テーブルモデルの「行挿入」イベント)、JComponent特殊化によってGUIコンポーネントの意味のあるイベントにマップされます。

たとえば、には、テーブルが表形式のデータにアクセスする方法のインターフェイスを記述するJTableというモデルがあります。TableModelこれのデフォルトの実装は、2次元配列で動作します。

Swing JComponentのビューコンポーネントは、概念的なGUIコントロールをグラフィカルに表すために使用されるオブジェクトです。GUIフレームワークとしてのSwingの違いは、(ネイティブホストOSのGUIコントロールの使用とは対照的に)プログラムでレンダリングされたGUIコントロールに依存していることです。Java 6 Update 10より前は、この区別は、ネイティブコントロールを使用するAWTコントロールをGUIのSwingコントロールと混合する際の問題の原因でした(AWTコンポーネントとSwingコンポーネントの混合を参照)。

最後に、視覚的な構成と管理の観点から、Swingは、絶対レイアウト(コンポーネントの正確な位置とサイズを指定する)ではなく、相対レイアウト(コンポーネント間の位置関係を指定する)を優先します。この「流動的な」視覚的順序付けへの偏りは、元のJavaGUIツールキットの設計と開発を構成するアプレットオペレーティング環境に由来するためです。(概念的には、レイアウト管理のこのビューは、ブラウザーでのHTMLコンテンツのレンダリングを通知するビューと非常によく似ており、前者を動機付けたのと同じ一連の懸念に対処します。)

AWTとの関係

AWTおよびSwingクラス階層

Javaの初期バージョン以降、Abstract Window Toolkit(AWT)の一部は、ユーザーインターフェイスコンポーネントにプラットフォームに依存しないAPIを提供してきました。AWTでは、各コンポーネントは、基盤となるウィンドウシステムに固有のネイティブピアコンポーネントによってレンダリングおよび制御されます。

対照的に、Swingコンポーネントは、オペレーティングシステムのウィンドウツールキットでネイティブリソースを割り当てる必要がないため、軽量であると説明されることがよくあります。AWTコンポーネントは、ヘビーウェイトコンポーネントと呼ばれます。[13]

Swing APIの多くは、通常、直接の置き換えではなく、AWTの補完的な拡張です。JApplet実際、Swingのすべてのトップレベルコンポーネント( 、、、、および)がAWTトップレベルコンテナを拡張するためJDialogすべてのSwingライトウェイトインターフェイスは最終的にAWTヘビーウェイトコンポーネント内に存在します。Java 6 Update 10より前は、 Zオーダーの非互換性のため、同じウィンドウ内で軽量コンポーネントと重量コンポーネントの両方を使用することは一般的に推奨されていませんでした。ただし、Javaの新しいバージョンではこれらの問題が修正されており、SwingコンポーネントとAWTコンポーネントの両方をZオーダーの問題なしに1つのGUIで使用できるようになりました。 JFrameJWindow

Swingが軽量コンポーネントを描画するために使用するコアレンダリング機能は、JFCの別の部分であるJava2D によって提供されます。

SWTとの関係

Standard Widget Toolkit(SWT)は、元々IBMによって開発され現在はEclipse コミュニティによって保守されている競合ツールキットですSWTの実装には、AWTのヘビーウェイトコンポーネントとの共通点があります。これにより、プログラミングモデルのネイティブプラットフォームへの露出が増える代わりに、基盤となるネイティブウィンドウツールキットの忠実度が向上するなどの利点が得られます。

SWTとSwingのパフォーマンスについては、かなりの議論と憶測が飛び交っています。SWTがJNIに大きく依存していると、GUIコンポーネントとJavaがデータを通信する必要がある場合は遅くなりますが、データモデルがGUIにロードされている場合はレンダリングが速くなりますが、どちらの方法でも確認されていません。[14] 2005年のかなり徹底的な一連のベンチマークは、一般的なケースでは、SwingもSWTも明らかに他を上回っていないと結論付けました。[15]

Hello World

この例のSwingアプリケーションは、「Hello、world!」を含む単一のウィンドウを作成します。中身:

// Hello.java(Java SE 8)
importjavax.swing  。* ;

public  class  Hello  extends  JFrame  { 
    public  Hello () { 
        super "hello" ); 
        これsetDefaultCloseOperation WindowConstants。EXIT_ON_CLOSE ; _ これadd new JLabel "Hello、world!" )); これパック(); これsetVisible true ); }
         
        
        
    

    public  static  void  main final  String []  args  { 
        SwingUtilities invokeLater こんにちは:: new ); 
    } 
}

1つ目は、パッケージ importのすべてのパブリッククラスとインターフェイスを含みます。javax.swing

HelloクラスextendsクラスJFrame; _ このJFrameクラスは、タイトルバーとクローズコントロールを備えたウィンドウを実装します。

Hello() コンストラクター、最初にスーパークラスコンストラクターを呼び出し、"hello"ウィンドウのタイトルとして使用されるパラメーターを渡すことにより、フレームを初期化します。setDefaultCloseOperation(int)次に、継承元のメソッドを呼び出してJFrame、タイトルバーの閉じるコントロールが選択されたときにデフォルトの操作を設定します。WindowConstants.EXIT_ON_CLOSE これによりJFrame、フレームが閉じられたときに(単に非表示にされるのではなく)が破棄され、Java仮想マシンが許可されます。終了し、プログラムを終了します。次に、JLabel文字列「Hello、world!」のaが作成されます。add(Component)スーパークラスから継承されたメソッドContainerが呼び出され、フレームにラベルが追加されます。pack()から継承されたメソッドWindowスーパークラスは、ウィンドウのサイズを決定し、その内容をレイアウトするために呼び出されます。

このmain()メソッドは、プログラムの起動時にJava仮想マシンによって呼び出されます。新しいフレームインスタンス化し、ブールパラメータを使用してスーパークラスから継承Helloされたメソッドを呼び出すことにより、フレームを表示させますコードはメソッドを使用して、AWTイベントディスパッチスレッドからコンストラクターを呼び出し、コードがスレッドセーフな方法で実行されるようにします。フレームが表示されたら、すべてのSwingトップレベルウィンドウが破棄されるまでイベントディスパッチスレッドがアクティブなままであるため、メソッドを終了してもプログラムは終了しません。 setVisible(boolean)ComponenttrueinvokeLater(Runnable)main

ボタン付きウィンドウ

Windows7で実行される基本的なサンプルコード

以下は、かなり単純なSwingベースのプログラムです。JFrameラベルとボタンを含む ウィンドウ(a)が表示されます。

import  java.awt.FlowLayout ; 
インポート javax.swing.JButton ; 
import  javax.swing.JFrame ; 
インポート javax.swing.JLabel ; 
インポート javax.swing.WindowConstants ; 
インポート javax.swing.SwingUtilities ;
 
パブリック クラス SwingExampleは Runnable {を実装します  

    @Override 
    public  void  run () { 
        //ウィンドウを作成します
        JFrame  f  =  new  JFrame "Hello 、!" ); 
        //ウィンドウが閉じられたときの動作を設定します
        f setDefaultCloseOperation WindowConstants。EXIT_ON_CLOSE ; _ //ボタンがラベルfの上に配置されないようにレイアウトマネージャーを追加しますsetLayout new FlowLayout ()); //ラベルとボタンfを追加します追加新しいJLabel 
        
         
        
         "こんにちは世界!" )); 
        f add new  JButton "Press me!" )); 
        //ウィンドウ内にコンポーネントを配置します
        f パック(); 
        //デフォルトでは、ウィンドウは表示されません。見えるようにします。
        f setVisible true ); 
    }
 
    public  static  void  main String []  args  { 
        SwingExample  se  =  new  SwingExample (); 
        //アプリケーションがイベントキューの正しい時間に実行されるようにスケジュールします。
        SwingUtilities invokeLater se ); 
    }

}

Runnableインターフェースを実装するクラスのインスタンスを作成することにより、Swingコンポーネントのすべてのインスタンス化と処理がどのように行われるかに注目してください。次に、これは、mainメソッドで作成されたメソッド()を使用して、イベントディスパッチスレッドで実行されます(スイングとスレッドの安全性を参照)。Swingコードは、この手法を使用せずに実行できますが(たとえば、Runnableを実装せず、すべてのコマンドをrunメソッドからmainメソッドに移動することにより)、Swingはスレッドセーフではないため、適切な形式と見なされます。複数のスレッドからリソースを呼び出すと、スレッドの干渉やメモリの整合性エラーが発生する可能性があります。[16]SwingUtilities.invokeLater(Runnable)

別の例

この例では、javax.swing.JFrameをスーパークラスとし、それに独自のウィジェット(この場合はJButton)を追加します。

import  javax.swing.JFrame ; 
インポート javax.swing.JButton ; 
import  javax.swing.JOptionPane ; 
インポート javax.swing.SwingUtilities ;

import  java.awt.event.ActionListener ; 
import  java.awt.event.ActionEvent ;

public  class  Sample  extends  JFrame  { 
	private  final  JButton  b  =  new  JButton ();

	public  Sample () { 
		super (); 
		これsetTitle "HelloApp" ); 
		これgetContentPane ()。setLayout null ); 
		これsetBounds 100、100、180、140 ; _  _ _  _ _  これadd makeButton ()); これsetVisible true ); これsetDefaultCloseOperation EXIT_ON_CLOSE );
		
		
		
	}

	private  JButton  makeButton () { 
		b setText "Click me!" ); 
		b setBounds 40、40、100、30 ; _  _ _  _ _  b addActionListener new ActionListener (){ public void actionPerformed ActionEvent e { JOptionPane .showMessageDialog b " Hello World!" ); } });
		  
			    
				 
			
		
		 bを返す; 
	}

	public  static  void  main String []  args  { 
		// Swing呼び出しは、イベントディスパッチスレッドによって実行される必要があります。
		SwingUtilities invokeAndWait (() -> 新しい サンプル()); 
	} 
}

Container.setLayout(LayoutManager)JFrameはデフォルトのレイアウトマネージャーとしてjava.awt.BorderLayoutを使用するため、このメソッドを使用してレイアウトはnullに設定されます。BorderLayoutを使用すると、コンテナーに追加されたものはすべて中央に配置され、他のウィジェットに対応するように引き伸ばされます。もちろん、ほとんどの実際のGUIアプリケーションは、すべてを絶対座標に配置するのではなく、レイアウトマネージャーを使用することを好みます。[17]

も参照してください

参考文献

引用

  1. ^ 「JavaSwingとは何ですか?-Techopediaからの定義」TechopediaInc 2018年11月3日取得
  2. ^ ヤップ、チー(2003-04-30)。「JAVASWINGGUIチュートリアル」ニューヨーク大学(NYU)2018年11月3日取得
  3. ^ 「EclipseでJavaFXを使用して基本的なGUIアプリケーションを開発する」
  4. ^ 「SunとNetscapeが共同でJavaFoundationClassesを開発する」ネットスケープコミュニケーションズ株式会社1997-04-02。2012-05-09にオリジナルからアーカイブされました2011年8月8日取得
  5. ^ 「SUNDELIVERSNEXT VERSION OF THE JAVAPLATFORM」サンマイクロシステムズ2007年8月。2007年8月16日のオリジナルからアーカイブ2012年1月8日取得JavaFoundationクラスはJava2プラットフォームのコアになり、次のものが含まれます。GUIコンポーネントのProject Swingセット、ドラッグアンドドロップ、新しい2DおよびAWTグラフィックス機能と印刷サポートを提供するJava 2D API、Javaルックアンドフィールインターフェイス、新しいAccessibility API{{cite web}}:CS1 maint:不適切なURL(リンク
  6. ^ 「JDK11アップデート:JavaFXはJDKから切り離されます」
  7. ^ 「EclipseでJavaFXを使用して基本的なGUIアプリケーションを開発する」
  8. ^ スミス、ドナルド(2018年3月7日)。「JavaFXおよびその他のJavaクライアントロードマップの更新の将来」
  9. ^ ザクアワー、シャロン。「なぜSwingはSwingと呼ばれるのですか?」Javaチュートリアルブログ2020年9月24日取得
  10. ^ ジョン、ユウ。「リッチクライアントは、Webアプリケーションの代替手段として登場します」ComputerWorld 2020年9月24日取得
  11. ^ Zukowski、ジョン(2007年8月21日)。「スイングスレッドとイベントディスパッチスレッド」JavaWorld2020年7月26日取得
  12. ^ ファウラー、エイミー。「スイングアーキテクチャの概要」サンマイクロシステムズ2020年7月26日取得
  13. ^ ザクアワー、シャロン; ペトロフ、アンソニー(2010年4月)。「ヘビーウェイトコンポーネントとライトウェイトコンポーネントの混合」Oracle 2020年7月26日取得
  14. ^ Strenn、Stephen(2006年3月3日)。「SwingとSWTのパフォーマンス-コールスタックを見てください」Javalobby2017年9月17日にオリジナルからアーカイブされました。
  15. ^ Žagar、Klemen; Križnar、Igor(2006年3月3日)。「SWTとSwingのパフォーマンスの比較」(PDF)(1.4版)。Cosylab。2015年5月26日にオリジナル(PDF)からアーカイブされましたSWTがSwingを上回る、またはその逆の経験則を示すことは困難です。一部の環境(Windowsなど)では、SWTが勝者です。その他(Linux、 WindowsをホストしているVMware)では、Swingとその再描画の最適化がSWTを大幅に上回っています。パフォーマンスの違いは重要です。どちらの方向でも、2倍以上の係数が一般的です。
  16. ^ http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.htmlイベントディスパッチスレッド
  17. ^ エッケル、ブルース(2006)。Javaで考える(PDF)(4版)。プレンティスホール。p。942. ISBN  978-01318724862016年5月14日にオリジナル (PDF)からアーカイブされました2016年5月13日取得
  18. ^ 「JavaFX開発者ホーム」www.oracle.com

ソース

外部リンク