マウス情報の取得

  1. マウス情報の取得

    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() の値は 1k回目のクリックで1,2回目のクリックで2となります。

    5. マウスをドラッグした場合
       マウスをドラッグ(ボタンを押したまま移動)すると、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));
        }


    6.  newボタンを押さないで、マウスをクリックしたりドラッグすると、マウスのイベントの名前と座標値が表示されます。new ボタンを押すと、以後マウスをクリックした点を接続する折れ線を表示します。ダブルクリックすると、折れ線の入力は終了します。
       ここで Edit ボタンを押すと、折れ線上の点をドラッグして位置を編集できます。再度Editボタンを押すと、編集モードを終了します。ドラッグしても、何も起こりません。
       newボタンを押すと、新しい折れ線の作成を開始します。



  2. 折れ線の作成と編集

    1. 目的
      マウスにより折れ線の作成と編集を行うプログラムを紹介します。

    2. GUI部品(ラベル)の配置
       
      1. 配置
        位置やサイズを指定して、マニュアル配置を行います。このため、setLayout(null); を行います。
         this.setLayout(null);
        マウスのx座標を表示する「ラベル」部品 xlabel は、
          xlabel.setText("0");
         xlabel.setBounds(new Rectangle(230, 273, 37, 17));
        で、初期値と、位置(230, 273)、サイズを設定します(37, 17)。
        xlabelを登録するには、次のようにthis(アプレット自身に)に add を行います。
         this.add(xlabel, null);
        ここでは他に、y座標を表示する ylabel 、イベントのメッセージを表示する eventlabel、各ラベルの意味を表示する、label1,label2,label3 を作成しています。

      2. ボタンの配置
         ここでは、new と edit のボタンを利用しています。ボタンの作成手順はラベルと同じですが、ボタンを押したとき、指定メソッドを呼び出すよう設定する必要があります。この設定法は、マウスの場合と類似しています。次はnewボタンが押されたとき実行されるメソッド、Newbutton_actionPerformed(e); を定義しています。

            Newbutton.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(ActionEvent e) {
                Newbutton_actionPerformed(e);
              }
            });

      3. ボタン処理
         ここでは、ボタンを使用不可にしたり、ボタンのラベルを途中で変更するなどの操作をしています。ボタン:Newbutton を利用不能にするには、以下を実行します。
         Newbutton.setEnabled(false);
        ボタンを有効に戻すには、Newbutton.setEnabled(ftrue);を実行します。また、ボタン:editbuttonのラベルを edit On に変更するには、以下を実行します。
         editbutton.setLabel("edit On");

    3. 折れ線の作成と編集
      1. 手法
         マウスの押し下げ位置を記録して、折れ線を作成します。折れ線を構成する点の位置は配列 line[] に記録します。
         Point line[]=new Point[20];
        マウスが押されたとき、呼び出される this_mousePressed() メソッドで
         line[numPoint]=mpos;
         numPoint++;
        を実行します。numPointは、記録された点の数を記憶します。このままでは、入力した点の数が20を越えると、配列のサイズを超えてしまいます。
         if(numPoint <line.length-2 ) numPoint++;
        で、エラーを避けることはできます。ここで、line.length は配列のサイズを意味します。

      2. 編集
         マウスを押し込んだとき、近くに 折れ線の点があれば、その点の座標をドラッグしたマウスの座標で置き換えます。マウスを離したとき、ドラッグを停止します。
         まず、マウスを押したときの処理は、this_mousePressed()の中で、以下のように、マウス位置と近いline[]の位置を探します。あれば、その配列の番号を、numSelectedに記録します。ここで、dist(p1,p2) は2点の距離を返すメソッドです。numSelectedは、通常は -1 にしておきます。
              numSelected=-1;
              for(int i=0;i<numPoint;i++){
                if(dist(line[i],mpos)<5) {
                  numSelected=i;
                  break;
                }
              }
        マウスをドラッグしたとき、this_mouseDragged()メソッドで、以下のような処理をします。
            if(numSelected >= 0) {
              line[numSelected].x=mpos.x;
              line[numSelected].y=mpos.y;
            }
        このご後、repaint(); で、line[] を折れ線で表示すれば、ドラッグ操作と共に、折れ線が変形します。

      3. モード設定
         マウスを押したときの処理は、新規作成中か編集中かで、変化します。この二つのモードを区別するため、newLine と editMode のフラグ(ブール型変数)を使います。new ボタンを押すと、newLineをtrueとし、editModeをfalseにします。ダブルクリックで、新規作成が終了すると、newLineをfalseにします。
         Editボタンを押すと、editModeを反転し、編集モードを切替えます。


    4. paint()
       paint()はアプレットの表示が必要になると呼び出されるメソッドで、たとえば、隠れていたアプレット画面が現れたときシステムから自動的に呼び出されます。また、アプレットのメソッドで、描き直しが必要なとき、repaint() を呼び出しますが、これは、現在の画面を消去後、paint() を呼び出します。
       ここでは、paint()は、直前のマウスのイベントの位置、line[]に記録された折れ線の表示を行います。また、折れ線の各点を小さな塗りつぶしの矩形で表示します。このとき、編集モードでドラッグしている点は赤色で表示しています。

    5. ソース
       全体のソースは、こちらをご覧下さい。