マウスイベント
2003.04.10 update.

マウスイベントの受け取り方法です。
マウスイベントは各ウィンドウごとでも取得できますが、 各ウィジットごと(描画領域とかボタンとか)に設定・取得することができます。
ウィンドウの上にウィジットが被さっている場合は、そのウィジットからマウスイベントを取得しないといけないです。

以下は、ラベル(Label)からマウスイベントを取得する例です。
ウィンドウの上全体にラベルが貼り付いている状態のため、ウィンドウ(Shell)からのマウスイベントは取得できないことになります。
そのため、ラベルにマウスリスナーを登録しています。


import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.events.*;

public class swtTest {
  public static void main(String argv[]){

    Display display = new Display();
    Shell shell = new Shell(display);

    //ウィンドウのタイトルを指定
    shell.setText("swtTest");

    FillLayout layout = new FillLayout(SWT.VERTICAL);
    shell.setLayout(layout);

    Label label = new Label(shell,SWT.BORDER);
    label.setText("Hello World!!");

    //ウィンドウのサイズを指定
    shell.setLocation(100,10);
    shell.setSize(300,100);

    label.addMouseListener(new MouseListener() {
      public void mouseDoubleClick(MouseEvent e){
        //マウスボタンがダブルクリックされたときの処理
        System.out.println("DoubleClick (x,y)=" + Integer.toString(e.x) + "," + Integer.toString(e.y));
        System.out.println("Button "+ Integer.toString(e.button));
      }
      public void mouseUp(MouseEvent e){
        //マウスボタンが離されたときの処理
        System.out.println("MouseUp (x,y)=" + Integer.toString(e.x) + "," + Integer.toString(e.y));
        System.out.println("Button "+ Integer.toString(e.button));
      }
      public void mouseDown(MouseEvent e){
        //マウスボタンが押されたときの処理
        System.out.println("MouseDown (x,y)=" + Integer.toString(e.x) + "," + Integer.toString(e.y));
        System.out.println("Button "+ Integer.toString(e.button));
      }
    });

    //イベントループ
    shell.open();
    while (!shell.isDisposed()){
      if (!display.readAndDispatch()){
        display.sleep();
      }
    }

    //破棄処理
    display.dispose();
  }
}


「addMouseListener」にて「MouseListener」を登録し、
マウスのダブルクリック(mouseDoubleClick)、
マウスアップ(mouseUp)、
マウスダウン(mouseDown)
イベントを取得しています。

マウスの移動イベントを取得

上記の方法では、マウスの移動イベントは取得できないため、 マウスの移動イベントは「addMouseMoveListener」にて以下のように行います。

各メソッドの「MouseEvent」より、マウス情報を取得することができます。
(e.x , e.y)が、各ウィンドウやウィジットの左上を(0,0)としたときのマウス位置となります。
「e.Button」がアクションのあったボタンの種別です。
1がマウス左・2がマウス真ん中・3がマウス右、のようです。


label.addMouseMoveListener(new MouseMoveListener() {
  public void mouseMove(MouseEvent e){
    //マウスが移動したときの処理
    System.out.println("MouseMove (x,y)=" + Integer.toString(e.x) + "," + Integer.toString(e.y));
    System.out.println("Button "+ Integer.toString(e.button));
  }
});


ただ、マウスドラッグ(マウスを押しながら移動)したとしても、ボタンの種別は「e.Button」からは取得できません。
このドラッグ処理の判別は、以下の方法で行います。

マウスドラッグイベントの判別


static boolean mouseLBut = false;
static boolean mouseRBut = false;
static boolean mouseCBut = false;

....

label.addMouseListener(new MouseListener() {
  public void mouseDoubleClick(MouseEvent e){
  }
  public void mouseUp(MouseEvent e){
    //マウスボタンが離されたときの処理
    if(e.button==1) mouseLBut = false;
    if(e.button==2) mouseCBut = false;
    if(e.button==3) mouseRBut = false;
  }
  public void mouseDown(MouseEvent e){
    //マウスボタンが押されたときの処理
    if(e.button==1) mouseLBut = true;
    if(e.button==2) mouseCBut = true;
    if(e.button==3) mouseRBut = true;
  }
});

label.addMouseMoveListener(new MouseMoveListener() {
  public void mouseMove(MouseEvent e){
    //マウスボタンが移動したときの処理
    System.out.println("MouseMove (x,y)=" + Integer.toString(e.x) + "," + Integer.toString(e.y));
    if(mouseLBut) System.out.println("Dragged");
  }
});


つまりは、「MouseListener」と連携して、「MouseListener」でマウスボタンが押されたら フラグを立てて、離されたらフラグを解除してやります。
これを「MouseMoveListener」内で見ればいいです。