Lesson 4: GUI

前回のアプレットはどうだったかな?
ブラウザを使って簡単に GUI を持ったアプリケーションが作れるのね。(いつも通りこの色は美樹ちゃん)
でも、ブラウザを使わずに GUI を持ったアプリケーションを作るにはどうしたらいいの?
それじゃあ今回は、Java アプリケーションで GUI (Graphical User Interface)を持つものを作成する方法を記述します。

Section 1: Swing API

Java アプリケーションで GUI を持つものを作成するには、Swing と呼ばれるパッケージを利用します。Swing パッケージには、GUI を構築する上で有用なクラスが数多く用意されています。

アプレットでは、トップレベルであるブラウザに Panel オブジェクトを貼り付けてボタンなどを配置しました。Swing では、ブラウザの代わりに Frame オブジェクトを作成し、Panel オブジェクトを貼り付けます。

Panel

Frame オブジェクトは、タイトルやバナー、ウィンドウの振る舞いを管理する方法を提供するトップレベルのウィンドウです。

それではまた、サンプルプログラムをもとに説明しましょう。

// Import Statements
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
 
class SwingSample extends JFrame implements ActionListener {
    // Instance Variables (Field)
    JLabel text;
    JButton button;
    JPanel panel;
    String textString;
    private int clickCount = 0;
 
    // Constructor
    SwingSample() {
        textString = "Swing Simple Program";
        text = new JLabel(textString);
        button = new JButton("Click Here");
        button.addActionListener(this);
 
        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBackground(Color.white);
        getContentPane().add(panel);
        panel.add(BorderLayout.CENTER, text);
        panel.add(BorderLayout.SOUTH, button);
    }
 
    // Event Handling
    public void actionPerformed(ActionEvent event){
        Object source = event.getSource();
        if (source.equals(button)){
            clickCount++;
            textString = "Button Clicked ";
            textString += Integer.toString(clickCount);
            text.setText(textString);
            button.setText("Click Again");
        }
    }
 
    // Main Method
    public static void main(String[] args) {
        SwingSample frame = new SwingSample();
        frame.setTitle("Swing Sample");
        WindowListener winListener = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
 
        frame.addWindowListener(winListener);
        frame.pack();
        frame.setVisible(true);
   }
}

このソースをコンパイルして実行すると、左の画面が表示されます。ボタン"Click Here"を一度クリックすると右の画面に変わります。

Prog1 Prog2

Section 2: パッケージの利用

Swing を利用する場合もパッケージを利用するので import します。アプレットと異なるのは、swing パッケージをインポートしていることです。

import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

Section 3: クラスの定義

クラスの定義ですが、トップレベルのフレームである JFrame クラスを継承し、 ActionListener をインプリメントしています。

class SwingSample extends JFrame implements ActionListener {

JFrameクラスは、Abstract Window Toolkit (AWT) APIの一部である Frame クラスを継承しています。Swing は、AWT のGUIコンポーネントや Look & Feel を継承しています。

Java API は、 クラスやインターフェースを提供しています。インターフェースは、メソッドの定義はしますがインプリメント(内部実装)はしていません。SwingSample クラスは、ActionListenerインターフェースをインプリメントするであろうと宣言しています。この宣言は、SwingSample クラスが ActionListenerインターフェースのすべてのメソッドをインプリメントしなければならないことを意味します。後で説明しますが、actionPerformedメソッドのインプリメントが必要になります。

Section 4: インスタンス変数(フィールド)

続いて、SwingSampleクラスで利用するインスタンス変数を宣言しています。これらは、使用の許されたクラスのメソッドで利用できる変数です。private int で宣言された変数はボタンの押された回数をカウントするために使用されます。

JLabel text;
JButton button;
JPanel panel;
String textString;
private int clickCount = 0;

Section 5: コンストラクタ

コンストラクタでは、JPanel オブジェクトを作成し、JButton や JLabel といったコンポーネントを追加しています。

SwingSample() {
    textString = "Swing Simple Program";
    text = new JLabel(textString);
    button = new JButton("Click Here");
    button.addActionListener(this);
 
    panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setBackground(Color.white);
    getContentPane().add(panel);
    panel.add(BorderLayout.CENTER, text);
    panel.add(BorderLayout.SOUTH, button);
}
JPanel オブジェクトに、JButton, JLabel オブジェクトを配置する際のレイアウトに NORTH, SOUTH, EAST, WEST, CENTER というアレンジを利用しています。これは、BorderLayout というレイアウトマネージャーの一つの機能で 右の図のようなレイアウトになります。レイアウトマネージャーはこのほかにもいくつか用意されています。Javaではコンポーネントを配置するとき、レイアウトマネージャーがそれぞれの正確な位置を決めてくれます。このことで、おおよその位置を示すだけで、細かい位置調整は全てレイアウトマネージャーが面倒を見てくれます。 JPanel

JFrameクラスのgetContentPaneメソッドの呼び出しは、JFrameオブジェクトに Panel オブジェクトを貼り付けることを意味します。JFrame オブジェクトに直接コンポーネント(JButton, JLabel)を貼り付けることは出来ません。また、Panel のようにコンポーネントを入れるためのコンポーネントをコンテナと呼びます。

Section 6: アクション・イベント

ActionListenerインタフェースのインプリメントをするわけですが、どのアクションに対して何を行うのかを定義します。SwingSampleでは、ボタンを押した際にあるアクションを与えるので JButtonコンポーネントに対してのイベントを監視します。

button.addActionListener(this);

Section 7: イベント・ハンドリング

actionPerformedメソッドは、生じたアクション・イベントに対して何を行うのかを記述します。SwingSampleでは、アクション・イベントがボタンひとつなので以下のように source.equals(button) をチェックする必要はないのですが、わかりやすくするためにあえて記述しています。

public void actionPerformed(ActionEvent event){
    Object source = event.getSource();
    if (source.equals(button)){
        clickCount++;
        textString = "Button Clicked ";
        textString += Integer.toString(clickCount);
        text.setText(textString);
        button.setText("Click Again");
    }
}

ボタンを押されたら、押された回数を表示するようにしています。

Section 8: メインメソッド

main メソッドでは、トップレベルである frame を作成します。タイトルや終了時の処理、フレームの表示を行います。

public static void main(String[] args) {
    SwingSample frame = new SwingSample();
    frame.setTitle("Swing Sample");
    WindowListener winListener = new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    };
 
    frame.addWindowListener(winListener);
    frame.pack();
    frame.setVisible(true);
}

SwingSample では、ウィンドウのイベント受け取るためのインタフェースである WindowListener を利用しています。 このインターフェースは、オープン、クローズ、アクティブなど7つのメソッドを定義しています。ここでは、特にいろいろなイベントを処理することもないのでウィンドウを閉じるイベントのみ実装しています。JFrameのコンストラクタは、見えないウィンドウを作成するので、画面上に表示するためには setVisible メソッドを呼び出しています。

[Prev] [Next]