【Java】マウス入力処理

2018年1月5日

本稿はマウス操作を実装する方法を紹介します。

マウスの入力を受け取るにはMouseListenerやMouseMotionListenerを実装してオーバーライドする方法とenableEventsによる有効化を行いprocessMouseEventメソッド等をオーバーライドする方法があります。

今回はMouseListener系の実装を行いマウスの入力を判断してみましょう。

マウスのクリックを検出する

マウスのクリックの取得はMouseListenerの実装しaddMouseListenerを呼び出しましょう。

マウスのクリックが右クリックか左クリックかはMouseEventのgetButtonメソッドの値とMouseEventの定数値を比較します。

マウスの座標を取得するにはMouseEventのgetX、getY、もしくはgetPointメソッドで取得できます。

それではサンプルをご覧ください。

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

import javax.swing.JFrame;

public class Test{
	public static void main(String[] args) {
		TestWindow gw = new TestWindow("テストウィンドウ",400,300);
		gw.setVisible(true);
	}
}
class TestWindow extends JFrame implements MouseListener{
	public TestWindow(String title, int width, int height) {
		super(title);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(width,height);
		setLocationRelativeTo(null);
		setLayout(null);
		setResizable(false);

		//マウス入力の有効化
		addMouseListener(this);
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// マウスのボタンがクリックされた
		switch ( e.getButton() ) {
		case MouseEvent.BUTTON1:
			System.out.println("左クリック");
			break;
		case MouseEvent.BUTTON2:
			System.out.println("ホイールクリック");
			break;
		case MouseEvent.BUTTON3:
			System.out.println("右クリック");
			break;
		}

		System.out.println("クリック座標"+e.getPoint());
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// マウスのボタンが押し下げられた
		switch ( e.getButton() ) {
		case MouseEvent.BUTTON1:
			System.out.println("左押し下げ");
			break;
		case MouseEvent.BUTTON2:
			System.out.println("ホイール押し下げ");
			break;
		case MouseEvent.BUTTON3:
			System.out.println("右押し下げ");
			break;
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// マウスのボタンが離された
		switch ( e.getButton() ) {
		case MouseEvent.BUTTON1:
			System.out.println("左離し");
			break;
		case MouseEvent.BUTTON2:
			System.out.println("ホイール離し");
			break;
		case MouseEvent.BUTTON3:
			System.out.println("右離し");
			break;
		}
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// 画面内にマウスカーソルが侵入した
		System.out.println("画面内に入りました。");
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// マウスカーソルが画面外へ出た
		System.out.println("画面外にでました。");
	}
}
実行結果

画面内に入りました。
左押し下げ
左離し
左クリック
クリック座標java.awt.Point[x=106,y=108]
右押し下げ
右離し
右クリック
クリック座標java.awt.Point[x=165,y=82]
ホイール押し下げ
ホイール離し
ホイールクリック
クリック座標java.awt.Point[x=281,y=55]
画面外にでました。

マウスをウィンドウ内に侵入させ、左クリック、右クリック、ホイールクリックし、ウィンドウ外側へマウスを移動させると、このような結果が得られるはずです。

マウスの動きを検知する

マウスの動きはMouseMotionListenerを実装し、JFrame等にaddMouseMotionListenerすると有効にできます。

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

import javax.swing.JFrame;

public class Test{
	public static void main(String[] args) {
		TestWindow gw = new TestWindow("テストウィンドウ",400,300);
		gw.setVisible(true);
	}
}
class TestWindow extends JFrame implements MouseMotionListener{
	public TestWindow(String title, int width, int height) {
		super(title);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(width,height);
		setLocationRelativeTo(null);
		setLayout(null);
		setResizable(false);

		//マウス移動の有効化
		addMouseMotionListener(this);
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		//ドラッグしたとき
		System.out.println("ドラッグされました。");
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		//移動したとき
		System.out.println("移動しました。"+e.getPoint());
	}

}

余談ですが、MouseListenerとMouseMotionListenerをどちらも使いたい場合はMouseInputListenerで両方の代用が可能です。

実行結果

移動しました。java.awt.Point[x=382,y=84]
移動しました。java.awt.Point[x=381,y=86]
移動しました。java.awt.Point[x=379,y=89]
移動しました。java.awt.Point[x=378,y=90]
ドラッグされました。
ドラッグされました。

マウスをウィンドウ内で移動させたりドラッグしたりすると、このような結果が得られるはずです。

マウスホイールを検知する

マウスホイールが回した時はMouseWheelListenerを利用することで実現できます。

MouseWheelEventのgetWheelRotationメソッドを呼び出すと手前に回したか奥に回したかを取得できます。

import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.JFrame;

public class Test{
	public static void main(String[] args) {
		TestWindow gw = new TestWindow("テストウィンドウ",400,300);
		gw.setVisible(true);
	}
}
class TestWindow extends JFrame implements MouseWheelListener{
	public TestWindow(String title, int width, int height) {
		super(title);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(width,height);
		setLocationRelativeTo(null);
		setLayout(null);
		setResizable(false);

		//マウスホイールの有効化
		addMouseWheelListener(this);
	}

	@Override
	public void mouseWheelMoved(MouseWheelEvent e) {
		//マウスホイールが回された時
		System.out.println("マウスホイールが回されました。");
		if ( e.getWheelRotation() == -1 ) {
			System.out.println("奥に回しました。");
		} else if (e.getWheelRotation() == 1) {
			System.out.println("手前に回しました。");
		}
	}

}
実行結果

マウスホイールが回されました。
奥に回しました。
マウスホイールが回されました。
手前に回しました。

マウスホイールを奥に一回、回してから手前に回すと、このような結果が得られるはずです。