アダプタークラスを使う
それにしても、ここではマウスをクリックしたときの処理をするmouseClickしか使っていないのに、いちいち5つのメソッドすべてをイベントリスナーに用意しなければいけません。毎回、これをやるのは正直、面倒です。
そこでJavaのクラスライブラリには、あらかじめイベントリスナーをimplementsしておいたクラスも用意されています。これは「アダプタクラス」と呼ばれるものです。これをextendsしてイベント処理を用意すれば、もっと簡単にイベント処理が作成できます。
public class SampleApp extends Frame {
private ArrayListlist;
public static void main(String[] args) {
new SampleApp().setVisible(true);
}
public SampleApp(){
list = new ArrayList();
this.addMouseListener(new MyMouseAdapter());
this.setSize(300,300);
}
public void paint(Graphics g){
g.setColor(Color.RED);
for(Point p : list){
g.fillOval(p.x - 10, p.y - 10, 20, 20);
}
}
class MyMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent ev) {
Point p = ev.getPoint();
list.add(p);
repaint();
}
}
}
package/import文は省略しました。これは、先ほどの例を、アダプタクラス利用の形に書き換えたものです。イベント処理をするMyMouseAdapterクラスを見てください。不必要なメソッドが消え、非常にシンプルになっていることがわかるでしょう。
「だったら、全部アダプタクラスを使うようにすればいいじゃないか」と思った人。そういうわけにもいかないのです。アダプタクラスはインターフェイスではなく普通のクラスですから、継承して新しいクラスを作る必要があります。ということは、既に何かのクラスを継承しているクラスでは使えない、ということになります。例えば、extends Frameしているクラスにイベント処理も持たせたい場合、「class ○○ extends Frame implements ○○Listener」といった具合にして1つのクラスですべてをまとめることができますが、アダプタクラスではそうはいきません。必ずイベント処理クラスを別に作る必要があります。
イベントリスナーとアダプタクラス、どちらがよいというわけではなく、場合によって使い分けるものだ、と考えるとよいでしょう。