目次

アプレットなJavaの基礎講座

マウスイベント処理

◆ はじめに

テキストフィールドは大体理解できましたか...。
今回は、マウスイベントを使って、簡単なお絵描きアプレットを作成してみましょう。

◆ マウスイベント処理のサンプル

以下は、アプレット上でマウスをドラッグすると線を描き、クリアボタンをクリックするとそれをクリア(消去)するものです。
まずは、サンプルソースを見てください。

尚、このサンプルソースは、「初体験 Java 」(著者 丸の内とら 技術評論社)をかなり参考にさせてもらいました。
著作権等の問題がありましたら、ご連絡ください。いつもお世話になっています!

jlearn09.javaの内容

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class jlearn09 extends Applet{
        Graphics myGrp;		//グラフィックスオブジェクトの宣言
        int posX;		//マウスのX座標の宣言
        int posY;		//マウスのY座標の宣言
        Button myBtn;           // ボタンオブジェクトの宣言
        public void init() {
                myGrp = getGraphics();  //グラフィックスオブジェクトのインスタンス取得
                // マウスのボタンが押された時の位置(x,y)を取得する。(今回は線の開始点の座標)
                addMouseListener(new MouseAdapter() {
                         public void mousePressed(MouseEvent e) {
                                posX = e.getX();
                                posY = e.getY();
                         }
                });
                // マウスでドラックした時の位置(x,y)を取得し、随時、その分、線を引く
                addMouseMotionListener(new MouseMotionAdapter() {
                        public void mouseDragged(MouseEvent e) {
                                myGrp.drawLine(posX, posY, e.getX(), e.getY());
                                posX = e.getX();
                                posY = e.getY();
                        }
			
                });
                myBtn = new Button("クリア"); // ボタンオブジェクトのインスタンス作成
                // ボタンクリック時にrepaint();でクリアー表示
                myBtn.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e){
                               repaint();
                        }
                });
                //ボーダーレイアウトを設定
                setLayout(new BorderLayout());
                
                //ボーダーレイアウトの南へボタンを配置
                add ("South", myBtn);
        }
}

全体の流れはコメントを見れば大体理解できると思いますが...。

『マウスのボタンが押された時の位置(x,y)を取得する』時と『マウスでドラックした時の位置(x,y)を取得し、随時、その分、線を引く』時に、アダプタークラスを利用しています。

これは、リスナーインターフェイス(interface)を implements してイベント処理クラスを作成する場合は、宣言されている全てのメソッドを実装する必要がありますが、しかし、アダプタークラスを継承して作成する場合は、処理したいイベントに対応するメソッドのみをオーバーライドすればよいことになり、通常このようにアダプタークラスを利用する方が普通になっています。

また、『ボタンクリック時』にアダプタークラスがないのは、ActionListenerクラスに関してはメソッドが一つしかないため実質不要だからです。

マウスイベントに対応するアダプタークラスは以下の種類があります。

タイミングマウスイベント名イベントリスナーイベントアダプター
マウスがクリックされた時mouseClickedMouseListenerMouseAdapter
マウスがボタンを押された時mousePressedMouseListenerMouseAdapter
マウスがボタンを離された時mouseReleasedMouseListenerMouseAdapter
マウスカーソルがアップレット領域に入った時mouseEnterdMouseListenerMouseAdapter
マウスカーソルがアップレット領域から出た時mouseExitedMouseListenerMouseAdapter
マウスでドラッグした時mouseDraggedMouseMotionListenerMouseMotionAdapter
マウスで動かした時mouseMovedMouseMotionListenerMouseMotionAdapter

補足

上記のようなリスナー&アダプターを利用してイベント処理を行うことをdelegation event modelと言います。

イベント発生源(イベントソース)そのものではなく、イベント処理の役割を持ったオブジェクトに処理を行わせるモデルです。

以前のイベント処理方法として、コンポーネント(イベントソース)自身にイベント発生時に呼び出されるメソッドがあり、これをオーバーライドすることでイベントのハンドリングを行うというモデルがありました。 これは Windows の MFC(Microsoft Foundation Class) 等でも使われている手法です。

しかし、delegation event model は、それとは異なり、イベントソースであるコンポーネントに対して、イベントを通知してほしいオブジェクト(イベントリスナ−)を登録することで、イベントがそのオブジェクトに委譲(delegate)される手法です。

◆ MS-DOSプロンプトからそのソースをコンパイルします。

ソースファイルが完成したら、MS-DOSプロンプトからそのソースをコンパイルします

D:\javalean>javac jlearn09.java
D:\javalean>dir /B
jlearn09.java
jlearn09.class

◆ APPLETタグで本クラスを指定したHTMLファイル(jleran09.htm)作成します。

jlearn09.htmの内容

<HTML>
<BODY>
<APPLET CODEBASE="../applet/" CODE="jlearn09.class" WIDTH="300" HEIGHT="300">
</APPLET>
</BODY>
</HTML>

        CODEBASE属性は、jlearn09.classとjlearn09.htmが同じフォルダーにあれば不要です。
        また、CODEBASE属性を指定しない場合、セキュリティ上の理由で参照可能なフォルダーは、
        現在の文書が含まれているフォルダーのサブフォルダーのみです。

さぁ! 9回目のAです。クリックしてアプレットを体験してください。

目次