イベントとイベントリスナーの関係


AWT(Abstract Window Toolkit)のコンポーネントを使ってウインドウを表示するところまでできるようになりました。次は、「コンポーネントを操作したときに何かを行わせる」ということを考えてみましょう。例えば、ボタンをクリックすると何かの処理を実行する、というようなことですね。

こうしたユーザが何かを操作するなどプログラムに対し何かの指示を行うようなときに用いられるのが「イベント」というものです。AWTには、さまざまな操作ごとに異なるイベントが用意されています。例えば「ボタンをクリックしたらこのイベント」「マウスを動かしたらこのイベント」というような具合ですね。そして、こうしたイベントが発生したときに何らかの処理を行わせるためのものとして「イベントリスナー」というものが用意されています。

イベントリスナーの中には、発生するイベントの種類に応じて呼び出されるメソッドが用意されています。例えばマウスを操作したときのためのイベントリスナーには「マウスボタンを押し下げる」「マウスボタンを離す」「マウスポインタがコンポーネントの領域に入ってくる」「マウスポインタがコンポーネントの外に出て行く」というように、たくさんのメソッドが用意されています。もちろん、イベントの内容によって用意されているメソッドは違ってきます。

Javaでは、何かのイベントが発生すると、そのイベントが発生したコンポーネントの中を調べ、そのイベントに対応したイベントリスナーが組み込まれていないかどうかチェックします。イベントリスナーが見つからなければ、何も起こりません。もし見つかった場合には、そのイベントリスナーの中にある、所定のメソッドを呼び出してイベントの処理を行います。

イベントリスナーは、コンポーネントなどと同様にnewでインスタンスを作成し、コンポーネント内のメソッドを使って組み込みます。では、実際に簡単な例をあげて、イベントリスナーの利用について説明しましょう。ここでは、「プッシュボタンをクリックしたときのイベント処理」を行ってみます。ボタンをクリックしたときの処理はもっとも広く使われる基本中の基本ともいえるものですから。
import java.awt.*;
import java.awt.event.*;

public class Sample extends Frame {
  Label label1;
  TextField field1;
  Button button1;

  public static void main(String[] args){
    new Sample();
  }
  
  public Sample(){
    this.setLayout(null);
    this.setSize(200,140);
    label1 = new Label("こんにちは!");
    field1 = new TextField();
    button1 = new Button("Click");
    label1.setBounds(20,40,160,20);
    field1.setBounds(20,70,160,20);
    button1.setBounds(50,100,100,20);
    button1.addActionListener(new ActionAdapter());
    this.add(label1);
    this.add(field1);
    this.add(button1);
    this.setVisible(true);
  }
}

class ActionAdapter implements ActionListener {

  public void actionPerformed(ActionEvent ev){
    System.out.println("クリックしました!");
  }
}
ボタンをクリックすると、コマンドプロンプトに「クリックしました!」と表示されます。


これをコンパイルし実行してみましょう。そして「Click」と表示されたボタンをクリックしてみると、コマンドプロンプトに「クリックしました!」と表示されます。ボタンをクリックしたときに、あらかじめ用意しておいた処理が実行されていることがわかりますね。