イベントリスナーとインターフェース
では、実際にイベントリスナーを使ってみましょう。まずは、イベントの中で最も使用頻度の高い「ボタンをクリックしたときのイベント」を使ってみることにしましょう。JButtonをクリックしたときに発生するイベントは「アクションイベント(ActionEvent)」というものです。これを処理するイベントリスナーは「アクションリスナー(ActionListener)」というものになります。これは、java.awt.eventパッケージに「ActionListener」というインターフェースとして用意されています。
インターフェースは、普通のクラスとはちょっと違います。これは、「概要を記述しただけの特殊なクラス」と考えるとよいでしょう。さまざまな「仕様」を記述するのに用いられるものです。インターフェースの詳細については、今はまだあまり深く知る必要はありません。重要なのはこれの使い方です。
インターフェースは、「1つのクラスに、複数の機能を持たせるために用いる」ことが多いのです。皆さんは、既に「継承」というものを使って、あるクラスの機能をそのまま持たせて新しいクラスを作ることができるのを知っています。しかしこの継承は、常に「1つのクラス」だけしか使えません。例えば「AとBのクラスの機能をそのままもらって新しいクラスを作りたい」と思っても、継承では不可能になります。
インターフェースは、1つのクラスにいくつでも組み込むことができます。インターフェースとして用意することで、同時にさまざまな機能をクラスに持たせることができるようになるわけです。このインターフェースは、次のようにしてクラスに組み込みます。
class クラス implements インターフェイス {……略……}
implementsの後に、インターフェース名を記述するだけです。複数のインターフェースをimplementsしたい場合は、それぞれをカンマで区切って記述します。
重要なのは、「インターフェースをimplementsしたクラスでは、そのインターフェースに用意されているメソッドをすべて実装しなければいけない」という点です。この点は、extendsによる継承と大きく異なる部分でしょう。
アクションリスナーを作る
では、ボタンクリックの処理をするアクションリスナーを作成し、JButtonに組み込んでみましょう。
package codezine.java; import java.awt.event.*; import javax.swing.*; public class Sample extends JFrame { JLabel label; JTextField field; JButton button; public Sample(){ this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(null); // JLabelの組み込み String msg0 = "<html><h3>Sample</h3></html>"; label = new JLabel(msg0); label.setSize(200,30); label.setLocation(20,20); this.add(label); // JTextFieldの組み込み field = new JTextField(); field.setSize(200,20); field.setLocation(20,50); this.add(field); // JButtonの組み込み button = new JButton("JButton"); button.setSize(100,25); button.setLocation(20,80); button.addActionListener(new ActionAdapter()); this.add(button); } public static void main(String[] args) { Sample sample = new Sample(); sample.setVisible(true); } } class ActionAdapter implements ActionListener { public void actionPerformed(ActionEvent ev){ System.out.println("You clicked Button!"); } }
ここでは、System.out.printlnを使って、ボタンをクリックしたらメッセージを出力させています。起動して現れたウインドウにあるボタンをクリックして、イベント処理が実行されていることを確認しましょう。
ActionListenerインターフェースの利用法
アクションリスナーは、java.awt.event.ActionListenerというインターフェースとして用意されています。これを利用するため、通常はjava.awt.event.ActionListenerをimportしておきます。
ここでは、implements ActionListenerしたクラスとして、ActionAdapterというクラスを定義しています。このActionListenerには、以下のようなメソッドが用意されています。
public void actionPerformed(ActionEvent ev){……略……}
従って、implements ActionListenerしたクラスでは、必ずこのメソッドを作成しておかなければいけません。ここに処理を記述すれば、アクションイベントが発生したときにそれが実行されるようになります。引数にあるActionEventは、やはりjava.awt.eventパッケージにあるクラスで、発生したアクションイベントに関する情報を管理するものです。とりあえず、この中身については、今は深く考えないでおきましょう。
では、このActionAdapterをどうやってJButtonに組み込めばよいのでしょうか。コンストラクタを見てみると、こんな文が見つかるはずです。
button.addActionListener(new ActionAdapter());
このaddActionListenerというのが、ActionListenerを組み込むためのメソッドです。これでbuttonにActionAdapterが組み込まれます。たったこれだけで、ボタンをクリックしたときの処理ができあがってしまいました。アクションリスナーの作成さえきちんとできれば、それほど複雑ではありません。
これはアクションリスナーの利用例ですが、基本的なイベントリスナーの使用法は、どのイベントでも大体同じです。そのイベント用に用意されているイベントリスナーのインターフェースをimplementsしてクラスを作成し、それを組み込みのためのメソッドでコンポーネントに組み込む。これで、そのコンポーネントでイベントが発生すれば、指定のメソッドを実行するようになるのです。イベントによってイベントリスナーは違いますし、場合によっては複数のメソッドが用意されていたり、メソッドの引数に渡されるクラスが違ったりしますが、全体の流れはほぼ同じです。
また、イベントリスナーやそれを組み込むメソッドを見ると、イベント関係のものに一定の命名規則があるらしいことが想像できます。アクションイベントを処理するのはActionListenerで、それを組み込むのがaddActionListenerということになります。その他のイベントについても、だいたいこのようにイベント名とリスナー名、組み込みメソッド名は一定の規則に従って命名されてます。

