Java には、AWT(Abstract Window Toolkit)と呼ばれる GUI アプリケーションを作成するためのクラス群が揃っています。このように何かするために揃えられたクラス群のことを Java ではパッケージ(package)と呼びます。他のプログラミング言語ではライブラリ(library)と呼ぶことが多いみたいです。
GUI の代表的なものはウィンドウでしょう。Java ではウィンドウのことをフレーム(frame)とも呼びます。ウィンドウはアプリケーションの土台となり、いろいろな GUI 部品を配置できる特別なものですが、ウィンドウ自身も 1 つの GUI 部品であることに変わりはありません。
なお、Java では、GUI 部品のことをコンポーネント(component)と呼びます。ウィンドウもコンポーネントの 1 つになります。
次のコードは、ウィンドウを表示するだけのアプリケーションのコードです。
Java はファイル名とクラス名を同じにしなければならないので、このコーナーでは、ファイル名は Hello.java、クラス名は Hello と決めています。
import java.awt.*;
class Hello {
public static void main(String[] args) {
Frame frame = new Frame("Frame");
frame.setSize(200, 100);
frame.setVisible(true);
}
}
Hello.java を javac でコンパイル(Do Javac)します。そして作成された Hello.class を JBindery でアプリケーションとして保存します。作成されたアプリケーションをダブルクリックすると、アプリケーションが起動します。
このアプリケーションはウィンドウのクローズボタンをクリックしても、ウィンドウを閉じたり、アプリケーションを終了したりすることはできません。アプリケーションを終了するには、アップルメニューから Quit を選んでください。
アプリケーションが起動してから、ウィンドウのクローズボタンがクリックされるなどのイベントが発生するまで何もせずに待機しているアプリケーションのことをイベントドリブン(event driven、イベント駆動)といいます。GUI アプリケーションはすべてイベントドリブンです。
そしてイベントを発生するものをイベントソース(event source)と呼びます。イベントソースは、多くの場合 GUI 部品(コンポーネント)です。そしてイベントを受け取って、それに対応する処理をするものをイベントリスナー(event listener)と呼びます。
先ほどのアプリケーションでは、イベントリスナーを設定していなかったため、ウィンドウを閉じたりすることができなかったのです。
イベントの受け手となるイベントリスナーはコンポーネント(GUI 部品)ごとに用意されています。ウィンドウには、WindowListener というものが用意されています。
なお、イベント発生源(イベントソース)となるコンポーネント(GUI 部品)には、最初からイベントを発生する設計になっています。
次のコードを Hello.java というファイル名で記述して、javac でコンパイルし、JBindery でアプリケーションとして保存してください。
なお、Java はファイル名とクラス名を同じにしなければならないので、このコーナーでは、ファイル名は Hello.java、クラス名は Hello と決めています。
import java.awt.*;
import java.awt.event.*;
class Hello implements WindowListener {
public static void main(String[] args) {
Frame frame = new Frame("WindowListener");
frame.setSize(200, 100);
frame.setVisible(true);
frame.addWindowListener(new Hello());
}
public void windowActivated (WindowEvent e) {}
public void windowClosed (WindowEvent e) {}
public void windowClosing (WindowEvent e) {System.exit(0);}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified (WindowEvent e) {}
public void windowOpened (WindowEvent e) {}
}
サンプルコードをわかりやすくするために、WindowListener を main メソッドのある Hello クラスで採用する型にしましたが、実際には、WindowListener 用に新たに別のクラスを作る方法が良く使われるみたいです。
上記のアプリケーションでは、処理しないイベントのメソッドも記述しなければいけないので大変でした。そこですべてのイベントに対して何もしない処理を記述したイベントアダプタ(event adapter)というクラスが用意されています。そのクラスを継承すれば、対応するイベントのメソッドのみを上書き(override)すれば良いことになります。ウィンドウ(フレーム)に対しては、WindowAdapter というクラスが用意されています。
import java.awt.*;
import java.awt.event.*;
class Hello extends WindowAdapter {
public static void main(String[] args) {
Frame frame = new Frame("WinodwAdapter");
frame.setSize(200, 100);
frame.setVisible(true);
frame.addWindowListener(new Hello());
}
public void windowClosing(WindowEvent e) {System.exit(0);}
}
ボタン(tutton)は、ウィンドウの次にメジャーな GUI 部品(コンポーネント)でしょう。
import java.awt.*;
import java.awt.event.*;
class Hello extends WindowAdapter implements ActionListener {
static Frame frame;
boolean isHello = true;
public static void main(String[] args) {
frame = new Frame("Hello");
frame.setSize(200, 100);
frame.setLayout(new FlowLayout());
frame.addWindowListener(new Hello());
Button button = new Button("Greeting");
frame.add(button);
button.addActionListener(new Hello());
frame.setVisible(true);
}
public void windowClosing (WindowEvent e) {System.exit(0);}
public void actionPerformed(ActionEvent e) {
if (isHello) {
frame.setTitle("Goodbye");
isHello = false;
} else {
frame.setTitle("Hello");
isHello = true;
}
}
}
ウィンドウの中に、文字列を表示するために一番良く使われる GUI 部品(コンポーネント)はラベル(label)でしょう。
import java.awt.*;
import java.awt.event.*;
class Hello extends WindowAdapter implements ActionListener {
static Label label;
boolean isHello = true;
public static void main(String[] args) {
Frame frame = new Frame("Greeting");
frame.setSize(200, 100);
frame.setLayout(new FlowLayout());
frame.addWindowListener(new Hello());
Button button = new Button("Greeting");
button.addActionListener(new Hello());
label = new Label("Hello");
frame.add(label);
frame.add(button);
frame.show();
}
public void windowClosing (WindowEvent e) {System.exit(0);}
public void actionPerformed(ActionEvent e) {
if (isHello) {
label.setText("Goodbye");
isHello = false;
} else {
label.setText("Hello");
isHello = true;
}
}
}
ラベルも何かのイベントは発しているはずです。しかしラベルは本来、ユーザが文字列を入力したりなどの操作ができるものではありません。したがってラベルのイベントリスナーについては何も設定していません。