アダプタクラス
空実装の簡易化
代行イベントモデルの概念は、前回のイベントプログラムでつかめたと思います
しかし、前回のプログラムで多くの方が感じたと思われますが
たとえ必要としないイベントであろうと、インターフェイスをインプリメントした場合
空実装しなくてはコンパイルできませんでした
この空実装は、時として非常に面倒になります
さらに、ソースも長くなり可読性の低下にもつながってしまいます
そこでアダプタクラスなるものが、各イベントに用意されています
アダプタクラスは、目的のインターフェイスをインプリメントしているクラスで
このクラスを拡張し、メソッドをオーバーライドすることで目的のプログラムを作ることができます
たとえばMouseAdapterクラスは、MouseListenerクラスをインプリメントしています
このクラスはメソッドを定義していない、抽象クラスです
MouseMotionListenerにはMouseMotionAdapterクラスというように
それぞれにアダプタクラスがサポートされています
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
public void init() {
setBackground(Color.white);
addMouseListener(new MouseClass(this));
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
Dimension dim = getSize();
MouseClass.setLine(g , dim.width / 2 , dim.height / 2);
}
}
class MouseClass extends MouseAdapter {
test obj;
static int x = 0 , y = 0;
public MouseClass(App25 obj) {
this.obj = obj;
}
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
obj.repaint();
}
static void setLine(Graphics g , int cx , int cy) {
g.drawLine(cx , cy , x , y );
}
}
このプログラムをアプレットビューワで実行すると
マウスでクリックした位置まで、コンポーネントの中心からラインが引かれます
(バッファを使っていないので、コンポーネントが更新されるときにも描かれますが…)
ですが、この状態でもやはり長くなりがちです
さらに、クラスをもう一つ定義しなくてはならないという面倒もありますね
そこで内部クラスを使用します。(コンソールJava入門を参照)
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
int x = 0 , y = 0;
public void init() {
setBackground(Color.white);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
repaint();
}
});
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
Dimension dim = getSize();
g.drawLine(dim.width / 2 , dim.height / 2 , x , y );
}
}
内部クラスの利用法として、このイベントハンドラが代表されます
その意味が、上のプログラムを見ればわかるでしょう
かなりコンパクトになっていますね