Buttonのclickイベントを扱う


Javaでclickなどのイベントに反応するプログラムを作るには、イベントが発生する側とイベントを処理するクラスを分けて作ります。
イベントを通知する相手(イベントを処理するオブジェクト)のことをリスナーと呼びます。
JButtonの場合、clickされるとActionEventが発生しますので、ActionEventを通知する相手(リスナー)をJButtonオブジェクトに指定しなければなりません。ActionEventのリスナーはActionListenerです。
つまり、Buttonのclickイベントを扱うには、ActionListenerインターフェースを実装したクラスを作る必要があると言えます。

JVMはコンポーネントでイベントが発生した事を感知すると、イベントソースオブジェクトに登録されているリスナーオブジェクトを探し出し、
リスナーに実装されているインターフェース(イベントに対応するメソッド)を呼び出します。

イベントハンドリングの参考になるページ
http://www.wakhok.ac.jp/~tatsuo/kougi99/index.html

sampleではイベントソースコンポーネントがボタン、イベントをハンドリングするオブジェクトがinnerクラスExamActionListenerです。

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

class  ExamJButtonClick   extends  JFrame {
    JButton  jb1, jb2;
    JPanel  jp;
    public  static  void  main(String  args[])  {
        ExamJButtonClick  ejbc  =  new  ExamJButtonClick();
        ejbc.addWindowListener(new  WindowAdapter() {
            public  void  windowClosing(WindowEvent  we)  {
                 System.exit(0);
            }
        });
        ejbc.setBounds(20,50,300,200);
        ejbc.setVisible(true);

    }
    ExamJButtonClick()  {
        super("Button  click");
        jb1   =   new  JButton("Green");
        jb2   =   new  JButton("Yellow");

     //  create  ActionListener
        ExamActionListener  eal   =    new  ExamActionListener();
     // set  actionListener  to  JButton
        jb1.addActionListener(eal);
        jb2.addActionListener(eal);

        jp    =  new JPanel();
        jp.add(jb1);
        jp.add(jb2);
        getContentPane().add(jp, BorderLayout.SOUTH);       
    }
    class  ExamActionListener  implements  ActionListener    {
        public   void  actionPerformed(ActionEvent   ae)  {
            if(ae.getSource()  ==  jb1)  {
                 jp.setBackground(Color.green);
            }
            if(ae.getSource()  ==  jb2)  {
                 jp.setBackground(Color.yellow);
            }
            
        }    
    }
}



実行結果
プログラムを起動した状態の画面です。
Greenボタンをclickした場合。
Yellowボタンをclickした場合。


getSource() method
2つのボタンのどちらがclickされたかを調べるには、ActionEventオブジェクトのgetSource()メソッドを使えば、オブジェクトが同一であるかどうか、比較可能です。
あるいは、getActionCommand()でコマンド文字列を取得します。コマンド文字列はdefaultで、Buttonのラベルテキストと同じでが、
JButtonクラスのsetActionCommand()メソッドで任意に設定できます。

actionPerformed() method
ActionListener インターフェースは、actionPerformedメソッド1つしかありませんから、対応するAdapterクラスはありません。
上のサンプルではinner classにActionListener インターフェースを使い、リスナーとして実装しています。
イベントが発生するコンポーネント(この場合はボタン)には、イベントの処理を依頼するリスナーのオブジェクトを指定するだけで、
actionPerformedメソッドを呼び出したりしません。actionPerformedメソッドを呼び出すのはJVMです。

ExamActionListenerはinnerClassですから、outerClassのメンバー変数であるボタンオブジェクトへの参照変数jb1,jb2は参照可能です。

EnterKeyに反応すするButtonの例