JAVA入門後期⑦ JAVAのSwingの基本構造
Swingとは 1.Swing は、 GUI (Graphical User Interface) 用パッケージ パッケージ名は javax.swing 2. AWT (Abstract Java Toolkit) で提供されていた GUI 機能 を強化 継承として実装されている AWT コンポーネントは必須(swing パッケージ以外に awt パッケージもインポートする必要がある) 3.Swingでは互換性が向上 AWT では 各 GUI 部品は、実行環境のウィンドウシステム を利用していたため、互換性に問題があり、部品の多いアプリケーションは重たくなる( “heavyweight” と呼ばれる) Swing は基本的には Java だけで書かれているので、互換 性が向上し、マシンリソースも少なくてむ( “lightweight” と 呼ばれる)
Swingアプリケーションの階層構造 1.Swing は三階層 ●トップレベルコンテナ(第一階層) Frame: JFrameクラス Dialog: JDialogクラス Applet: JAppletクラス ●中間コンテナ(第二階層) 他のSwingコンポーネントを配置する為などに用いる Panel: Jpanelクラス Scroll pane: JScrollPaneクラス など ●コンポーネント 個々の部品を表す JButton, JComboBox, JTextField, JTextArea, JLabel, JFileChooser, JTable など
Swingアプリケーション作成手順 1.パッケージ java.awt.*, javax.swing.* のインポート 2.トップレベルコンテナのクラスを継承しクラスを作成する 3.部品のインスタンス化 3.1 トップレベルコンテナのインスタンス化 3.2 中間コンテナのインスタンス化 3.3 コンポーネントのインスタンス化 4.コンポーネントの配置 4.1 中間コンテナにレイアウトマネージャーを登録 4.2 コンポーネントを配置 5.コンポーネントにアクションリスナーを登録
Swingアプリケーション作成手順 6.中間コンテナの配置 6.1 トップレベルコンテナからコンテントペインの取得 6.1 トップレベルコンテナからコンテントペインの取得 6.2 コンテントペインにレイアウトマネージャーを登録 6.3 コンテントペインに中間コンテナを配置 7.メニュー部品のインスタンス化 7.1 メニューバーのインスタンス化 7.2 メニューのインスタンス化 7.3 メニューアイテムのインスタンス化 8.メニューアイテムにアクションリスナーを登録 9.メニューバーをフレームに追加 10.トップレベルコンテナのセットアップ
Swingアプリケーション作成手順 11.イベント処理(アクションリスナー、マウスイベント、等) 各イベント処理用のインターフェースを実装するクラスを 作成 ●以上が Swing アプリケーションで必要な基本的道具 あるものは必須ではなく、あるものは複数を組み合わせて 使う。 例えば、 ・中間コンテナは必ずしも必要ではなく、トップレベルコンテ ナに直接コンポーネントを配置しても良い ・レイアウトマネージャーは複数組み合わせることがある
簡単な例 import java.awt.*; import javax.swing.*; public class HelloSwing extends JFrame { // 部品はプライベートで宣言しておく private JFrame frame; private JLabel label; // コンストラクター(別にメッソドを作成しても良い) HelloSwing(String title) { // JFrameのインスタンス化 frame = new JFrame(title); // JLabelのインスタンス化 label = new JLabel("Hello Swing!");
簡単な例 // JFrameのコンテントペインの取得 Container con = frame.getContentPane(); // コンテントペインにJLabelを配置 // (直接配置、レイアウトマネージャーも未使用) con.add(label); // フレームのセットアップ frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); }
実施結果
簡単な例(解説) 1.パッケージのインポート import java.awt.*; import javax.swing.*; 2.トップレベルコンテナのクラスを継承しクラスを作成する public class HelloSwing extends JFrame { // 部品はプライベートで宣言しておく private JFrame frame; private JLabel label; // コンストラクター(別にメッソドを作成しても良い) HelloSwing(String title) {
簡単な例(解説) 3.部品のインスタンス化 // JFrameのインスタンス化 frame = new JFrame(title); // JLabelのインスタンス化 label = new JLabel("Hello World!"); 4.及び6.コンポーネントの配置 // JFrameのコンテントペインの取得 Container con = frame.getContentPane(); // コンテントペインにJLabelを配置 // (直接配置、レイアウトマネージャーも未使用) con.add(label);
簡単な例(解説) 10.トップレベルコンテナのセットアップ // フレームのセットアップ frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } 順に、 ●クローズボタン(ウィンドウ右上の×ボタン)の処理(例ではプログラムを終了) ●推奨サイズでウィンドウを表示 ●ウィンドウを可視化 を行う
レイアウトマネージャー AWTと同じように、コンポーネントの配置方法を指定する方法 としてレイアウトマネージャーを使用する。 Swingでは、コンポーネントの他に、中間コンテナの配置もレイ アウトマネージャーで行う。 基本的に、レイアウトマネージャーは、AWTのものを利用してい る。 (Swingで幾つか追加されたものはあるが、滅多に使わない。) デフォルトは、AWTの時と同じFlowLayoutである。
レイアウトマネジャー(抜粋) 名前 説明 FlowLayout 左上から順に詰めていく BorderLayout 上下左右と中央の位置に最大5つの配置 CardLayout 同じ大きさのコンポーネントを重ね合わせて配置 GirdLayout 格子状に配置 GirdBagLayout 格子状に配置、柔軟な配置指定可能
FlowLayout (復習) ●左上から順に詰めていくように配置 書式: FlowLayout(int alignment, int hgaps, int vgaps) alignment : コンポーネントの配置位置 設定位置は以下。 ・ FlowLayout.CENTER 行内で中央揃え ・ FlowLayout.RIGHT 行内で右揃え ・ FlowLayout.LEFT 行内で左揃え ・ FlowLayout.TRAILING 行内で右端揃え ・ FlowLayout.LEADING 行内で左端揃え hgaps : コンポーネントの水平方向の間隔 vgaps : コンポーネントの垂直方向の間隔
FlowLayout (復習) デフォルトの設定 con.setLayout(new FlowLayout()); は con.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5) と同じこと。
BoaderLayout (復習) ●コンポーネントを中央を中心にして、東西南北に配置 書式: BoaderLayout(int hgaps, int vgaps) hgaps:水平方向の間隔 vgaps:垂直方向の間隔 指定の方法例: con.setLayout(new BoaderLayout(5, 5)); Button bt1 = new Button(“button-North”); con.add(bt1, BoaderLayout.NORTH ); North West Center East South
BoaderLayout (復習) 配置の位置 設定名 北 “North” または、BorderLayout.NORTH 中央 “Center”または、BorderLayout.CENTER 南 “South” または、BorderLayout.SOUTH 東 “East” または、BorderLayout.EAST 西 “West” または、BorderLayout.WEST
GridLayout (復習) ●コンポーネントを指定された配列の格子状に配置 書式: 書式: GridLayout(int rows, int colums int haps, int vgaps) rows : 行の数 colums : 列の数 haps : 水平方向の間隔 vgaps : 垂直方向の間隔 配置される順番はaddメソッドの順に左上から右方向に配置 「行数×列数」>コンポーネントの場合、不足分は空き 「行数×列数」<コンポーネントの場合、列数が自動的に増加
レイアウトマネージャー使用例 import java.awt.*; import javax.swing.*; public class HelloSwing extends JFrame { // 部品はプライベートで宣言しておく private JFrame frame; private JLabel label; private JButton button; // コンストラクター(別にメッソドを作成しても良い) HelloSwing(String title) { // JFrameのインスタンス化 frame = new JFrame(title); // JLabelのインスタンス化 label = new JLabel("Hello Swing!");
レイアウトマネージャー使用例 // JButtonのインスタンス化 button = new JButton("OK"); // JFrameのコンテントペインの取得 Container con = frame.getContentPane(); // コンテントペインにJLabel,JButtonを配置 con.setLayout(new FlowLayout()); con.add(label); con.add(button); // フレームのセットアップ frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); }
実行結果
中間コンテナ コンポーネントを直接トップレベルコンテナに配置するのではな く、幾つかのコンポーネントを一旦纏めで配置しておき、更に、 その幾つかの纏まったものをトップレベルコンテナに配置する、 といった二段構えのレイアウトを行うことが出来ます。 その中間的な纏め役をおこなうのが、中間コンテナです。 中間コンテナの例 JPanel: コンポーネントを纏める一般的なクラス JScrollPane: コンポーネントに付随してスクロールバー等を 追加します
中間コンテナ使用例 import java.awt.*; import javax.swing.*; public class HelloSwing extends JFrame { // 部品はプライベートで宣言しておく private JFrame frame; private JPanel panel; private JScrollPane scroll; private JLabel label; private JButton button; private JTextArea textArea; // コンストラクター(別にメッソドを作成しても良い) HelloSwing(String title) { // JFrameのインスタンス化 frame = new JFrame(title);
中間コンテナ使用例 textArea = new JTextArea( "テキストが入力できます", 10, 30); // JScrollPane のインスタンス化 scroll = new JScrollPane(textArea); scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scroll.setPreferredSize( new Dimension(500, 250)); // JPanelのインスタンス化 panel = new JPanel(); // JLabelのインスタンス化 label = new JLabel("Hello Swing!");
中間コンテナ使用例 // JButtonのインスタンス化 button = new JButton("OK"); // コンポーネントの追加 panel.setLayout(new FlowLayout()); panel.add(label); panel.add(button); // JFrameのコンテントペインの取得 Container con = frame.getContentPane(); // コンテントペインにJPanel, JScrollPaneを配置 con.setLayout(new BorderLayout()); con.add(panel, BorderLayout.NORTH); con.add(scroll, BorderLayout.CENTER);
中間コンテナ使用例 // フレームのセットアップ frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); }
実行結果