マウス情報の取得

  1. 目的
    ここでは、アプレットやフレームでマウス情報を取得する方法を紹介します。マウスのボタンを押したときのマウスの位置を取得する、あるいはマウスをドラッグしたとき、その位置を連続して取得する、ことなどが目的です。

  2. 利用法

    1. マウスイベント
       マウスのボタンを押したり、マウスを移動したとき、マウスから計算機のその情報が通知されます。これをイベント(出来事)といいます。このイベントを受け取ったとき、イベントに対応する「メソッド」を起動するよう「仕掛け」を設定できます。この仕掛けを「リスナ」といいます。

    2. マウスリスナの組み込み
       マウスを操作したとき、実行されるメソッドを定義する方法はいくつかありますが、ここでは、アダプタクラスを利用した方法を説明します。マウスのアダプタクラスには、マウスを押したときや離したとき実行されるメソッドに対応する MouseAdapter() クラスと、マウスをドラッグしたり移動したときのメソッドに対応する addMouseMotionListener クラスがあります。
       以下は、マウスを押したときに呼び出される this_mousePressed(e); と、離したとき呼び出されるメソッド this_mouseDragged(e); を定義します。

          this.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(MouseEvent e) {
              this_mousePressed(e);
            }
            public void mouseReleased(MouseEvent e) {
              this_mouseReleased(e);
            }
          });
      また、以下はマウスをドラッグしたとき呼び出されるメソッドを定義します。MouseEvent e より、マウスを押したり離したときのマウスの位置を取得できます。
            this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
              this_mouseDragged(e);
            }
          });
      これを実行すると、マウスをドラッグすると this_mouseDragged(e); が連続的に呼び出されます。

    3. マウスの押し下げ処理
       マウスを押し下げたとき呼び出されるメソッドの例です。ここでは、ラベルに mousePressed を表示し、xlabelとylabelの二つのラベルに、マウスの座標を表示します。mposはPointクラスのインスタンスで、mpos.x でそのx座標を取得できます。
        void this_mousePressed(MouseEvent e) {
          mpos=e.getPoint();
          eventlabel.setText("mousePressed");
          xlabel.setText(Integer.toString(mpos.x));
          ylabel.setText(Integer.toString(mpos.y));
        }

    4. ダブルクリックの処理
       マウスがダブルクリックされたとき、処理内容を変更したい場合があります。この場合、e.getClickCount() で一定時間内にマウスをクリックしたときの回数を取得できます。ダブルクリックされると、this_mousePressed が2回呼び出され、e.getClickCount() の値は 1回目のクリックで1,2回目のクリックで2となります。

    5. 右ボタンが押された
       ボタンにも種類があります。押されたボタンの情報は、e.getModifiers() で取り出すことができます。右ボタンを押したことは定数 InputEvent.BUTTON3_MASK で取り出すことができます。従って、
       (e.getModifiers() & InputEvent.BUTTON3_MASK)
      が0でないとき、右ボタンが押されたことになります。

    6. マウスをドラッグした場合
       マウスをドラッグ(ボタンを押したまま移動)すると、this_mouseDragged(MouseEvent e) メソッドが連続して呼び出されます。以下のような表示を行うと、mouseDraggedの表示と共に、xlabelとylabelの値が連続的に表示されます。呼び出される間隔は一定ではありません。

        void this_mouseDragged(MouseEvent e) {
          mpos=e.getPoint();
          eventlabel.setText("mouseDragged");
          xlabel.setText(Integer.toString(mpos.x));
          ylabel.setText(Integer.toString(mpos.y));
        }

  3. プログラム

    1. ラベル
       文字を表示するラベルに関しては、こちらを参照して下さい。

    2. ソース
      import java.awt.*;
      import java.awt.event.*;
      import java.applet.*;
      
      public class Mouse extends Applet{
          
        private Label xlabel = new Label();
        private Label ylabel = new Label();
        private Label eventlabel = new Label();
      
         Point mpos=new Point(0,0);
            
        public void init() {
          this.setLayout(null);
          
          //xとyのラベルを作成
          xlabel.setText("0");
          xlabel.setBounds(new Rectangle(120, 20, 40, 17));        
          ylabel.setText("0");
          ylabel.setBounds(new Rectangle(170, 20, 40, 19));
              
          eventlabel.setBounds(new Rectangle(10, 20, 100, 17));
      
          this.add(ylabel, null);
          this.add(eventlabel, null);
          this.add(xlabel, null);
          
          //マウスリスナの定義
          this.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(MouseEvent e) {
            this_mousePressed(e);
            }
            public void mouseReleased(MouseEvent e) {
            this_mouseReleased(e);
            }
          });
              
          this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
              public void mouseDragged(MouseEvent e) {
              this_mouseDragged(e);
              }
            public void mouseMoved(MouseEvent e) {
              this_mouseMoved(e);
            }
            });
        }
      
        //マウスボタンが押された
          void this_mousePressed(MouseEvent e) {
          mpos=e.getPoint();
          eventlabel.setText("mousePressed");
          if(e.getClickCount()==2) eventlabel.setText("DoubleClicked");
          if((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
            eventlabel.setText("RightButtonPressed");
          xlabel.setText(Integer.toString(mpos.x));
          ylabel.setText(Integer.toString(mpos.y));
          //System.out.println("mouseCount:"+e.getClickCount()+"num:"+numPoint);
          repaint();
          }
      
      
          void this_mouseReleased(MouseEvent e) {
          eventlabel.setText("mouseReleased");
          xlabel.setText(Integer.toString(mpos.x));
          ylabel.setText(Integer.toString(mpos.y));
          //editMode=false;
          repaint();
          }
          
        //マウスがドラッグされた  
        void this_mouseDragged(MouseEvent e) {
          mpos=e.getPoint();
          eventlabel.setText("mouseDragged");
          xlabel.setText(Integer.toString(mpos.x));
          ylabel.setText(Integer.toString(mpos.y));
          repaint();
        }
        
        void this_mouseMoved(MouseEvent e) {
          mpos=e.getPoint();
          eventlabel.setText("mouseMoved");
          xlabel.setText(Integer.toString(mpos.x));
          ylabel.setText(Integer.toString(mpos.y));
          repaint();
        }
      
      }

    3. 実行
       マウスを移動する、ドラッグする、ボタンを押す、離す、ダブルクリックする、右ボタンを押す、とメッセージとマウス位置が表示されます。