3.2. アクションリスナー
実は「java.awt.event.ActionListener」はクラスではなくインタフェースです。このインタフェースを実装したクラスが「java.awt.event.ActionEvent」を処理する事になるわけです。では複数の「java.awt.event.ActionListener」を実装したクラスがある場合、どのクラスがイベントを処理するのでしょうか?
それはイベントの発生元ごとに、どのクラスで処理するか設定します。「javax.swing.JButton」クラスの場合は「addActionListener」メソッドで、イベントを処理するクラスを設定します。以下にサンプルを示します。
import javax.swing.*; import java.awt.event.*; import java.awt.BorderLayout; public class SampleFrame extends JFrame implements ActionListener{ private JLabel label; private JButton leftButton; private JButton rightButton; public SampleFrame(){ super("sample"); setDefaultCloseOperation(EXIT_ON_CLOSE); label=new JLabel("label"); getContentPane().add(label,BorderLayout.NORTH); leftButton=new JButton("left"); getContentPane().add(leftButton,BorderLayout.WEST); leftButton.addActionListener(this); rightButton=new JButton("right"); getContentPane().add(rightButton,BorderLayout.EAST); rightButton.addActionListener(this); pack(); } public void actionPerformed(ActionEvent event){ if(event.getSource().equals(leftButton)){ label.setText("left"); }else if(event.getSource().equals(rightButton)){ label.setText("right"); } } public static void main(String args[]){ new SampleFrame().setVisible(true); } }
5行目で「SampleFrame」クラスが「ActionListener」インタフェースを実装すると宣言していますので、このクラスで「JButton」クラスのイベントを処理する事ができます。
19・23行目で2つの「JButton」クラスのインスタンスにアクションリスナーを設定しています。「this」というのは、自分自身のインスタンスを表すキーワードです。この場合は、自分自身でイベントを処理すると宣言しているわけです。
「this」は便利なキーワードで、「this.メソッド(引数)」とすると自分自身のメソッド、「this.メンバ変数」とすると自分自身のメンバ変数、「this(引数)」とすると自分自身のコンストラクタを呼び出すことができます。「super」と並んで覚えておくと良いでしょう。setterメソッド(値をセットするメソッド)などで、以下のように利用すると便利です。
public void setName(String name){ this.name=name; }
28〜34行目がボタンを押されたときに行う処理です。「ActionEvent」の「getSource」メソッドはイベントの発生元を返すメソッドです。これを利用する事により、2つのボタンのどちらが押されたかが解ります。あとはそれぞれのボタンを押された場合の処理を記述するだけです。
実は「addActionListener」メソッドによって、複数の「ActionListener」インタフェースを実装したイベントハンドラを登録する事ができます。その場合は、順にそれぞれのハンドラの「actionPerformed」メソッドが呼び出されていくことになります。
(実習課題1)
以下のサンプルプログラムを作成しなさい。
- フレームに含まれるコンポーネントはラジオボタン(JRadioButton)3つ・ボタン(JButton)とラベル(JLabel)1つ。表示するテキストと配置は任意。
- 3つラジオボタンは同時に複数選択できないものとする。
- 1つのボタンが押されると、選択されているラジオボタンに対応するテキストをラベルに表示する。
- (ヒント)ボタンが押されたときに、各ラジオボタンの状態を調べる。
(実習課題2)
以下のサンプルプログラムを作成しなさい。
- フレームに含まれるコンポーネントはチェックボックス(JCheckBox)3つとラベル(JLabel)1つ。配置は任意。
- ラベルにはその時点で選択されているチェックボックスの個数を表示する。
- チェックボックスの状態が変わる毎に、ラベルの表示を切り替える。
- (ヒント)「java.awt.event.ItemListener」を使用する。
- (ヒント)「javax.swing.JCheckBox」の「isSelected」メソッドを使用する。
(実習課題3)
以下のサンプルプログラムを作成しなさい。
- フレームに含まれるコンポーネントはラベル(JLabel)2つとメニュー。メニューには通常のメニューアイテム(JMenuItem)3つとラジオボタンメニューアイテム(JRadioButtonMenuItem)2つ。メニューのテキストおよび配置は任意。
- ラジオボタンメニューは同時に1つしか選択できないようにする。
- 1つのラベルにはメニューアイテムが選択されたときに対応するテキストを表示する。もう1つのラベルには選択されているラジオボタンメニューに対応するテキストを表示する事。
- (ヒント)メニューアイテムには「java.awt.event.ActionListener」を使用する。
- (ヒント)ラジオボタンメニューアイテムには「java.awt.event.ItemListener」を使用する。