JavaでSwingを利用したGUIアプリケーションの作成2(ボタン、ラベルの配置)
ウィンドウを表示するだけの単純なGUIアプリケーションに続き、ボタンやラベルといったGUIコンポーネントをJFrameに配置したGUIアプリケーションを作成する。
Swingコンポーネントの種類
Swingコンポーネントは以下の3つの階層に分類される。
1.トップレベルコンテナ(JFrame等)
メインウィンドウとなるコンポーネントであり、ほかのコンポーネントの土台となる。
2.中間コンテナ(JPanel等)
コンポーネントを配置するためのコンテナの役割。
3.コントロール(JLable、JButton等)
ボタンやラベルなどの個々のGUI部品。
Swingでは、この3つの階層のコンポーネントを組み合わせてアプリケーションを作成する。
JLabelなどのコントロールを持ったアプリケーションを作成するには、まずトップレベルコンテナを作成し、そこに中間コンテナを配置し、さらに中間コンテナにコントロールを配置するといった手順を踏むことになる。
プロジェクトの作成
プロジェクト名「SwingSample02」を作成する。
1.[ファイル]⇒[新規]⇒[プロジェクト]を選択
2.[Javaプロジェクト]を選択し[次へ]をクリック
3.プロジェクト名等を入力し[完了]をクリック
- プロジェクト名に「SwingSample02」を入力
- プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択
クラスの作成
GUIアプリケーションの起動および各コンポーネントの作成を行う「SwingAppMain」クラスを作成する。
1.[ファイル]⇒[新規]⇒[クラス]を選択
2.[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック
- パッケージに「swing.sample」を入力
- 名前に「SwingAppMain」を入力
- public static void main(String[] args)をチェック
3.作成したクラスに以下のクラスをインポート
- javax.swing.JButton
- javax.swing.JFrame
- javax.swing.JLabel
- java.awt.BorderLayout
4.mainメソッド内で「JFrame」クラスのインスタンス(mainFrame)を生成し初期設定を行いラベル、ボタンを配置
以下の項目の実装
- JFrameクラスのインスタンスを生成
- 閉じるボタン押下時のアプリケーションの振る舞いを決定
- ウィンドウの初期サイズ(幅、高さ)をピクセル単位で設定
- ウィンドウの表示場所を規定(画面の中央に表示)
- mainFrameのContentPaneを取得(contentPane)
- [JLabel]クラスのインスタンス(label)を生成
- [JButton]クラスのインスタンス(button)を生成
- contentPaneにlabelを追加
- contentPaneにbuttonを追加
- ウィンドウの表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package swing.sample; // 必要なクラスのインポート import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class SwingAppMain { /** * @param args */ public static void main(String[] args) { // JFrameクラスのインスタンスを生成 JFrame mainFrame = new JFrame("サンプル"); // 閉じるボタン押下時のアプリケーションの振る舞いを決定 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ウィンドウの初期サイズ(幅、高さ)をピクセル単位で設定 mainFrame.setSize(320, 160); // ウィンドウの表示場所を規定 mainFrame.setLocationRelativeTo(null); // JFrameよりContentPaneを取得 Container contentPane = mainFrame.getContentPane(); // ラベルのインスタンスを生成 JLabel label = new JLabel("SwingLabel"); // ボタンのインスタンスを生成 JButton button = new JButton("SwingButton"); // ラベルをContentPaneに配置 contentPane.add(label, BorderLayout.CENTER); // ボタンをContentPaneに配置 contentPane.add(button, BorderLayout.SOUTH); // ウィンドウを表示 mainFrame.setVisible(true); } } |
5.[実行]→[Javaアプリケーション]を選択して、実行する
実行した結果、タイトルバーに「サンプル」、ラベルとボタンが配置されたウィンドウが開く
各コンポーネントの役割と機能
ContentPane
ContentPaneとは、JFrameの表示領域。
JFrameに表示したいコンポーネントは、ContentPaneに追加する必要がある。
ContentPaneの取得
1 | Container contentPane = mainFrame.getContentPane(); |
上記コードのgetContentPaneメソッドで、ContentPaneを取得している。
ContentPaneは、Containerクラスの型で取得できるが、JFrameの中でJPanelとして生成されている。
JPanelクラス
JPanelは、複数のコンポーネントを配置できるコンテナ(コンポーネントを張り付ける台紙のイメージ)。
Swingでは、JPanelのような中間コンテナにコンポーネントを張り付ける感覚で画面を作成する。
コンポーネントの配置
1 2 | contentPane.add(label, BorderLayout.CENTER); contentPane.add(button, BorderLayout.SOUTH); |
上記コードで、ContentPaneにコンポーネントを追加することができる。
addメソッドの第1パラメータでは、ContentPaneに配置したいコンポーネントを指定。
第2パラメータでは、コンポーネントを配置する位置を指定。
BorderLayout.CENTERは、コンポーネントをContentPaneの中心に配置することを意味している。(BorderLayoutクラスの定数)
レイアウトマネージャ
コンテナ内のコンポーネントのレイアウトに関してはレイアウトマネージャが管理している。
レイアウトマネージャにはBorderLayoutや、GridLayoutなどさまざまな種類のものがある。
これらのレイアウトマネージャを使用することでコンテナ内の統一的なレイアウトを簡単に実現することができる。
BorderLayoutクラス
BorderLayoutは、「east、west、south、north、center」の5つの領域に分けてコンポーネントを配置する。
1つの表示領域には、1つのコンポーネントを配置することができる。
設定されたコンポーネントは、その領域を満たすサイズで表現される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | Package swing.sample; import java.awt.BorderLayout; import javax.swing.Jbutton; import javax.swing.Jframe; import javax.swing.Jpanel; public class BorderLayoutSample { /** * @param args */ public static void main(String[] args) { Jframe mainFrame = new Jframe(“BorderLayoutSample”); mainFrame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); mainFrame.setSize(320, 160); mainFrame.setLocationRelativeTo(null); Jpanel contentPane = (Jpanel) mainFrame.getContentPane(); Jbutton north = new Jbutton(“north”); Jbutton west = new Jbutton(“west”); Jbutton east = new Jbutton(“east”); Jbutton center = new Jbutton(“center”); Jbutton south = new Jbutton(“south”); contentPane.add(north, BorderLayout.NORTH); contentPane.add(west, BorderLayout.WEST); contentPane.add(east, BorderLayout.EAST); contentPane.add(center, BorderLayout.CENTER); contentPane.add(south, BorderLayout.SOUTH); mainFrame.setVisible(true); } } |
Jlabelクラス
Jlabelクラスは、文字列やイメージの表示に使用するクラス。
インスタンスの生成
1 | JLabel label = new JLabel("SwingLabel"); |
上記コードで、JLabelクラスのインスタンスを生成している。
コンストラクタには、JLabelで表示したい文字列を設定している。
また、表示したい文字列はインスタンスを生成した後で設定することも可能。
その場合は、JLabelクラスのsetTextメソッドを使用する。
表示文字列の配置位置の制御
JLabelは、表示文字列の配置位置を制御することができる。
1 | label.setHorizontalAlignment(SwingConstants.CENTER); |
上記コードで、labelインスタンスに設定した文字列が中央に表示される。
etHorizontalAlignmentは、表示文字列の横軸に沿った配置位置を制御するメソッド。
パラメータのSwingConstants.CENTERで表示文字列を配置する位置を指定する。
SwingConstantsは、JLabelが継承しているインターフェイスで、コンポーネントの配置に関する定数が定義されている。
JLabel、JButton等のSwingConstantsを継承したクラスは、SwingConstantsの定数を使用することで、配置の指定に関する表現が統一されている。
JButtonクラス
JButtonクラスは、プッシュボタンを表現するクラス。JLabel同様、イメージを表示することも可能。
インスタンスの生成
1 | JButton button = new JButton("SwingButton"); |
上記コードで、JButtonクラスのインスタンスを生成している。
コンストラクタには、JButtonで表示したい文字列を設定している。
JLabelと同じく、setTextメソッドを使用することで後から表示文字列を設定することができる。
有効無効の制御
ボタンの有効無効を制御するには、setEnabledメソッドを使用する。
1 | button.setEnabled(false); |
上記コードで、buttonインスタンスで生成したボタンが無効状態となる。
setEnabledメソッドは、パラメータのboolean値で有効無効を指定することができる。
trueの場合が有効、falseの場合が無効を意味する。
このsetEnabledメソッドは、トップレベルコンテナ(JFrame等)以外のすべてのSwingコンポーネントが継承しているJComponentクラスのメソッド。
よって、トップレベルコンテナ以外のSwingコンポーネントはsetEnabledメソッドにより、有効無効を制御することができる。
JLabelもsetEnabledメソッドを使用して有効無効を制御することができる。