マウスのイベント

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

マウスイベントを検出

マウスに関するイベントは、以下の7つを検出し、それぞれ対応するメソッドが呼び出されます。
此等のメソッドは、2つのリスナインターフェースの何れかに所属しています。

マウスイベントの処理一覧

イベント メソッド リスナインターフェース アダプタクラス(注)
マウスボタンが押された mousePressed MouseListener MouseAdapter
マウスボタンが離された mouseReleased
マウスボタンがクリックされた mouseClicked
マウスが画面に入った mouseEntered
マウスが画面から出た mouseExited
マウスがドラッグされた mouseDragged MouseMotionListener MouseMotionAdapter
マウスが動いた mouseMoved

(注)アダプタについては、後述

マウスのボタンが押されて、同じ位置で離された時、クリックイベントが発生します。
其の為、1回のクリック操作で、

マウスボタンが押された
マウスボタンが離された
マウスボタンがクリックされた

と言う3つのイベントが発生します。
一方、マウスのボタンが押された侭移動した時は、ドラッグイベントが発生します。
マウスボタンを押さずに、マウスを動かした時は「マウスが動いた」イベントが発生します。

MouseListenerのimplements

此処では、マウスのクリックを検出して円を描きます。
マウスがクリックされた時の処理は、MouseListenerインターフェースのメソッド「mouseClicked」に記述しますので、作成するクラスにMouseListenerをimplementsします。
此の時、MouseListenerインターフェースに登録されている全てのメソッドをオーバーライドしなければなりません。
例え、オーバーライドが必要なのが「mouseClicked」だけであったとしても全部です。

マウスイベントの登録

プログラムがマウスのイベントを検出出来る様にする為には、コンストラクタにマウスリスナを追加します。

addMouseListener(this);

此処では、同じクラスに「MouseListener」のメソッドをオーバーライドしたメソッドが有るので、引数は「this」になります。

public class Mouse1 extends Frame implements MouseListener{
        /***********コンストラクタ************/
        public Mouse1(){
                addMouseListener(this);
                        :
                        :
        }
        mouseListenerのメソッドをオーバーライド
}

マウスのイベント情報

マウスのイベントが発生した時に処理を記述するメソッドは、MouseEventクラスの引数を取ります。
此には、マウスのイベントに関する情報が詰まっています。
此の中、マウスのイベントが発生した「(x, y)」座標を求めるメソッドは、

getX()
getY()

です。
此等のメソッドで得られる座標が、描画する円の中心の座標になります。

Graphicsの取得と解放

イベント処理中に円を描きます。
図形を描画するのに必要なGraphicsクラスのオブジェクトは、

Graphics g = getGraphics();

で取得出来ます。
描画が終了したら、

g.dispose();

で解放します。

中心「(x, y)」、半径「r」で有る円の描画

楕円を描くメソッド「drawOval」は、外接する四角形の左上の座標と幅と高さを引数とします。
此処では、中心の座標と半径を基に円を描くので、

g.drawOval(x-r, y-r, 2*r, 2*r);

となります。

抽象クラス

インターフェースをimplementsすると、不要のメソッド迄全てオーバーライドしなければなりません。
其処で、「MouseListener」をimplementsしただけのクラスが予め用意されています。
其れをアダプタと言いますが、イベントが発生した時は、各々のクラスで異なるので、「予め」と言う訳には往きません。
其処でアダプタでは、メソッドを定義するだけで内容は何も書かれておらず、必要な処理は各クラスでメソッドをオーバーライドして記述します。
此の様に、定義だけで処理が書かれていないクラスを抽象クラスと言います。
抽象クラスを継承したサブクラスでは、必要なメソッドだけをオーバーライドします。
抽象クラスと言えども「Frame」を継承しているクラスに、更に継承出来ません。
其処で、アダプタを継承した別のクラスを作成します。

マウスイベントの登録

アダプタを継承して作成する独自クラスは、此を利用するクラス特有の物なので、内部クラスにします。
此をインスタンス化した物を、addMouseListenerの実引数とします。

public class クラス名 extends Frame{
        public クラス名(){
                内部クラス名 オブジェクト名 = new 内部クラス名();
                addMouseListener(オブジェクト名);
                        :
                        :
        }
                        :
                        :
        class 内部クラス extends アダプタ名(){
                メソッドの定義
        }
ソース ダウンロード
Mouse1.java Mouse01.zip
Mouse1A.java

戻る