Translate

2017年2月3日金曜日

マウスのイベントを取得する

MouseListnerの実装

マウスのイベントを取得するためにはMouseListenerを利用する。MouseListenerはImageCanvasで実装する
public class hoge extends PlugInFrame {
    public static icMouseAdapter ima;
    public static ImagePlus imp;

    ...

    public hoge() { 
        imp = WindowManager.getCurrentImage();
        ImageCanvas ic = imp.getCanvas();
        ic.addMouseListener(ima = new icMouseAdapter(imp));

        ...

    }
}
ij.WindowManager.getCurrentImage()を使うと、現在アクティブな画像のImagePlusオブジェクトを取得することができる。

MouseAdapterクラス

ImageCanvasオブジェクトを取得したのち、addMouseListenerメソッドで実装する。ここでインスタンスしているicMouseAdapterは以下のようなクラスになる。
public class icMouseAdapter extends MouseAdapter implements Measurements {

    ... 
    public ImagePlus imp;

    public icMouseAdapter(ImagePlus imp) {
        this.imp = imp;
    }

    public void mouseClicked(MouseEvent e) {
        // マウスがクリックされたときの処理
    }
}
MouseAdapterクラスは、マウスイベントを受け取るための抽象アダプタクラスである。マウスのイベントには当然ほかにもいろいろあるが(ドラッグとかホイールの回転とか)、この場合継承しているのでinterfaceと違い、すべてのメソッドを実装する必要はない。
メソッドのパラメータMouseEvent eを使えば、マウスの座標情報を得ることができる。
int x = e.getX();
int y = e.getY();
ただし、もし画像が拡大・縮小されていた場合、マウスをクリックした場所の座標データを取得すると、本当に欲しい画像上の座標ではなく、拡大・縮小された画像での座標を取得することになってしまう。そこで、ImageCanvas.offScreenX(int x)を使う。
int x = ic.offScreenX(e.getX());
int y = ic.offScreenY(e.getY());
これで、マウスがクリックされた場所の座標データを取得することができる。

MouseListenerインターフェース

一方、Interfaceを使ってマウスイベントの取得方法を使うこともできる。

public class icMouseAdapter implements MouseListener, Measurements {

    ... 
    public ImagePlus imp;

    public icMouseAdapter(ImagePlus imp) {
        this.imp = imp;
    }

    public void mouseClicked(MouseEvent e) {
        // マウスがクリックされたときの処理
    }
    public void mouseEntered(MouseEvent e) {
        // マウスがコンポーネントに入ったときの処理
    }
    public void mouseExited(MouseEvent e) {
        // マウスがコンポーネントから出たときの処理
    }
    public void mousePressed(MouseEvent e) {
        // マウスのボタンが押されたとき
    }
    public void mouseReleased(MouseEvent e) {
        // マウスのボタンが離れたとき
    }
}
MouseListenerはInterfaceなので、使わないメソッドもすべて実装する必要があるが、もしほかのクラスを継承したいためにMouseAdapterが使えない(多重継承できないため)場合には、このInterfaceが使える。
プラグインが終わるなどしてMouseListenerの取り除く場合は
ic.removeMouseListener(ima);
としてやればよい(ImageListenerの場合と同じようにする)。
以上

0 件のコメント:

コメントを投稿