MouseMotionListener

広告

MouseListenerではアプレット上でマウスがクリックされたりや、マウスのアプレット領域への出入りは把握出来ましたが、アプレットの上にある状態でマウスがどのように動いているかまではクリックされるまで分かりませんでした。MouseMotionListenerはこのような場合に利用し、アプレットの上でマウスが移動している間、イベントを出し続けます。

MouseMotionListenerの場合のリスナーとメソッドの関係は下記の通りです。

実装するリスナー
  MouseMotionListener

リスナーの登録
  addMouseMotionListener

発生するイベント
  MouseEvent

呼ばれるメソッド
  mouseDragged(MouseEvent e)   マウスがアプレットの上でドラッグされた
  mouseMoved(MouseEvent e)     マウスがアプレットの上で動いた

ドラッグされたとは、マウスのボタンが押された状態で動いている状態のことです。

基本的な使い方は下記のようになります。

import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;

public class EventTest extends Applet implements MouseMotionListener{
  public void init(){
    addMouseMotionListener(this);
  }

  public void mouseDragged(MouseEvent e){
  }

  public void mouseMoved(MouseEvent e){
  }
}

mouseDraggedメソッドやmouseMovedメソッドの引数として渡されてくる値は、MouseListenerの場合と同じくMouseEventクラスのオブジェクトですので、同じようにイベントが発生した時のマウスの座標情報などを取得できます。

またリスナーはインターフェースですので同時にいくつも登録できます。MouseMotionListenerと同時にMouseListenerも使う場合には下記のようにして下さい。

import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;

public class EventTest extends Applet
  implements MouseListener, MouseMotionListener{

  public void init(){
    addMouseListener(this);
    addMouseMotionListener(this);
  }

  // ....
}

サンプルプログラム

では簡単な例で試してみましょう。マウスの移動に合わせてマウスの位置を中心に円を描きます。またドラッグ中は四角を描くようにします。

EventTest3.java

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.Point;
import java.awt.Color;

/*
<applet code="EventTest3.class" codebase="class" width="300" height="300">
</applet>
*/

public class EventTest3 extends Applet implements MouseMotionListener{
  int x, y;
  int type;
  int width;

  public void init(){
    x = 0;
    y = 0;
    type = 0;
    width = 20;

    addMouseMotionListener(this);
  }

  public void update(Graphics g){
    paint(g);
  }

  public void paint(Graphics g){
    if (type == 1){
      g.setColor(Color.red);
      g.drawOval(x - width, y - width, width * 2, width * 2);
    }else if (type == 2){
      g.setColor(Color.blue);
      g.drawRect(x - width, y - width, width * 2, width * 2);
    }
  }

  public void mouseDragged(MouseEvent e){
    Point point = e.getPoint();
    x = point.x;
    y = point.y;
    type = 2;

    repaint();
  }

  public void mouseMoved(MouseEvent e){
    Point point = e.getPoint();
    x = point.x;
    y = point.y;
    type = 1;

    repaint();
  }
}

下記で実際に試して頂くことができます。

EventTest3.html

アプレット上でマウスを動かした時

MouseMotionListenerテスト

アプレット上でドラッグ(マウスを押した状態で動かす)した時

MouseMotionListenerテスト

( Written by Tatsuo Ikura )