Java Step_9 イベント


「ボタンをクリックした」や「テキストフィールドに文字が入力 された」など、ユーザーがアクションを起こすとGUIコンポーネントはイベントを発生します。
メソッドの中では、あらかじめ決められた順序で実行が進んでいきますが、人間がマウスをいつクリックするかは予想がつきません。ですから、あらかじめメソッド呼び出しを書いておくことはできません。
このように、いつ起こるか分からないことを扱うために、Javaではイベント(event)というものを使います。それぞれのイベントには、発生源となるオブジェクト(イベントソース(event source) )と、イベントが起きるのを待っているオブジェクト(イベントリスナー(event listener) )が存在します。Javaでは、どの種類のイベントリスナーが、どの種類のイベントを受け取るかはあらかじめ決まっています。イベントが発生するとイベントリスナーに対してイベントを通知します。

イベントの種類

《主なイベントソースとイベント》
イベントソースアクションイベント
ラベル フォーカスをほかのGUIコンポーネントに移すFocusEvent
ラベルをクリックするActionEvent
マウスで操作するMouseEvent
ボタン フォーカスをほかのGUIコンポーネントに移すFocusEvent
ボタンをクリックするActionEvent
マウスで操作するMouseEvent
テキストフィールド Enterキーを押すActionEvent
フォーカスをほかのGUIコンポーネントに移すFocusEvent
インプメソッドでテキスト入力するInputMethodEvent
キーボードから入力するKeyEvent
マウスで操作するMouseEvent
テキストを変更するTextEvent
テキストエリア フォーカスをほかのGUIコンポーネントに移すFocusEvent
インプメソッドでテキスト入力するInputMethodEvent
キーボードから入力するKeyEvent
マウスで操作するMouseEvent
テキストを変更するTextEvent


イベントリスナー

《主なイベントとイベントリスナー》
イベントイベントリスナー
ActionEventActionListener
FocusEventFocusListener
InutMethodEventInutMethodListener
KeyEvenKeyEventListener
MouseEventMouseListener
MouseMotionListener
TextEvenTextListener


インターフェース

Javaでは、クラス(class)とは別にインターフェース(inteface)という概念があります。インターフェースとはメソッドの集合であり、親が異なるクラスに対しても同じメソッドを提供することができます。
JAVA では1つのスーパークラスからサブクラスを作成するという単一継承しか出来ませんでした。単一継承は継承の親子関係がはっきりするのでクラスの作成や保守管理が楽になります。しかし、単一継承では複数利用したいクラスが存在した場合にどれか1つのクラスしか使うことが出来ないので、他のクラスを無駄にしてしまいます。この無駄を回避するために JAVA では,単一継承でありながらインターフェースという方法を用いることで,複数の性質を受け継いだサブクラスを作成することが出来ます。
インターフェースとは、メソッドの名前や引数の形態だけを記述したもので、そのメソッドがどのような働きをするか等は全く定義されていないものです。

<インタフェース定義>
interface インターフェース名 {
	定数宣言;
	抽象メソッド宣言;
}

<インターフェース定義の例>
interface InterA {
	int INTERA_X = 200;//必ず初期化する
	void intera_meth(int a);//処理本体がない
}


<クラス定義時にインターフェースを実装>
class クラス名 implements インターフェース名,インターフェース名,.. {
	抽象メソッド名
	処理定義 {
	}

<インターフェース実装の例>
class クラス名 implements InterA{
	public void intera_meth(int a){
	...........;//抽象メソッドの処理本体を定義
	}
	...........;
	}


《ボタンを押して文字を表示するサンプルプログラム》
//ボタンを押してDOSプロンプトにボタンを表示する

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;//イベント関連クラスのパッケージ

class ButtonEvent1{
   public static void main(String args[]){

      //JFrameのインスタンスを生成しJFrameクラス型の変数 f に代入
      JFrame f = new JFrame("ButtonEvent1");//
      //ウィンドウをクローズしたら終了する
      f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
      //フレームのコンテナ(GUIコンポーネントを配置するオブジェクト)を得る
      Container c = f.getContentPane();
      //JButtonのインスタンスを生成
      JButton b = new JButton("Click");
      
      //自作のイベントリスナー「クラス」myListener1のコンストラクタで
      //インスタンスを作成している。(インスタンス=クラス名と同名のメソッド)
      myListener1 m1 = new myListener1();
      
      //JButtonクラスのメソッド
      //引数のActionListenerインスタンスm1をボタンbに登録
      b.addActionListener(m1);
      
      c.add(b);
      f.pack();
      f.setVisible(true);
   }
}
//ActionListenerインターフェースのイベント処理メソッドの本体
class myListener1 implements ActionListener{
   public void actionPerformed(ActionEvent ae){
     System.out.println("ボタンがクリックされました");
  }
}
      

《実行結果》


  1. イベントリスナーインターフェースを実装してイベントリスナークラスを定義する
  2. その中でイベント処理メソッドの本体を定義する
  3. イベントリスナークラスのインスタンスを作る
  4. そのインスタンスをGUIコンポーネントに登録する


《押されたボタンを判別するサンプルプログラム》
//押されたボタンを判別する

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;//イベント関連クラスのパッケージ

class ButtonEvent2{
   public static void main(String args[]){

      //JFrameのインスタンスを生成しJFrameクラス型の変数 f に代入
      JFrame f = new JFrame("ButtonEvent2");//
      
      //ウィンドウをクローズしたら終了する
      f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
      
      //フレームのコンテナ(GUIコンポーネントを配置するオブジェクト)を得る
      Container c = f.getContentPane();
      
      //JButtonのインスタンスを生成(複数ボタンを作る)
      JButton ba = new JButton("ボタンA");
      JButton bb = new JButton("ボタンB");
      
      
      //自作のイベントリスナー「クラス」myListener1のコンストラクタで
      //インスタンスを作成している。(インスタンス=クラス名と同名のメソッド)
      myListener2 m1 = new myListener2();
      
      //それぞれのボタンに同じイベントリスナーを登録する
      //ボタンA にイベントリスナーを登録
      ba.addActionListener(m1);
      //ボタンB にイベントリスナーを登録
      bb.addActionListener(m1);
      
      c.add(ba,BorderLayout.WEST);
      c.add(bb,BorderLayout.EAST);
      f.pack();
      f.setVisible(true);
   }
}
//ActionListenerインターフェースのイベント処理メソッドの本体

class myListener2 implements ActionListener{
   public void actionPerformed(ActionEvent ae){
    //ae ←ActionEventオブジェクトが入っている

    //
     String bname = ae.getActionCommand();
     System.out.println(bname + "がクリックされました");
  }
}
 

《実行結果》