Javaでのマウス処理

 

Javaが目指したのは、同じ(Javaの)ソフトが色々な機器、つまり色々な端末や
OS(環境と言ったりします)で動くことです。

毎度、管理人イガジーです。

でも、現実には、物理的に異なる機器では、どうしても同じことができません。
例えば、Appleのパソコン(MAC)ではマウスボタンが1つしか無いので、
Windowsパソコンで一般的な右クリックと左クリックで処理を分けるという事ができないのです。

という訳で、今日はJavaでのマウス処理についてです。
Javaでマウスの処理を行うには、MouseListenerを使います。

Eclipseで
class MyMouseA0 implements MouseListener {と入力すると、「未実装のメソッドがある」と警告がでてきます。
「よきにはからえ」とおまかせすると

class MyMouseA0 implements MouseListener {
	@Override
	public void mouseClicked(MouseEvent e) {
		//クリック
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		//マウスがやってきた
	}
	@Override
	public void mouseExited(MouseEvent e) {
		//マウスが出ていった
	}
	@Override
	public void mousePressed(MouseEvent e) {
		//ボタンが押された
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		//ボタンが離された
	}
}

と補完されます(”//ボタンが押された”などは管理人イガジーの補足)。
これらがMouseListenerでのイベント処理です。(MouseListenerの他に、
MouseMotionListenerやMouseWheelListenerというものもあります)

「クリック以外には用はない」という場合はMouseAdapterを使うのが簡単です。

クリックされた座標は、MouseEvent e を使って

int px=e.getX();
int py=e.getY();

で得る事ができます。

あとでプログラム例を示しますが、これを動かしてみると、左クリックでも
右クリックでも中央クリックでも、同じmouseClicked()が呼び出されます。
(細かいことを言うと、クリックでは mousePressed() → mouseReleased()
→ mouseClicked() になり、ドラッグすると、mousePressed() → mouseReleased()
までで mouseClicked()は呼び出されません。)

1ボタンマウスの環境は無視して、左右クリックを区別したい時は
次のように Modifiers をチェックします。

class MyMouseA1 extends MouseAdapter {
	@Override
	public void mouseClicked(MouseEvent e) {
		int px=e.getX();
		int py=e.getY();
		int modi=e.getModifiers();
		if ((modi&MouseEvent.BUTTON1_MASK)!=0) {
			System.out.print("Left ");
		}
		if ((modi&MouseEvent.BUTTON2_MASK)!=0) {
			System.out.print("Center ");
		}
		if ((modi&MouseEvent.BUTTON3_MASK)!=0) {
			System.out.print("Right ");
		}
		System.out.printf("Click %d %d\n",px,py);
	}
}

サンプルプログラムを以下に示します。

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;

public class MouseTest {
	BufferedImage b2=new BufferedImage(150,300,BufferedImage.TYPE_INT_RGB);
	Graphics g2=b2.getGraphics();
	Font fnt=new Font(Font.SANS_SERIF,Font.PLAIN,16);
	Canvas0 cv0;
	Canvas1 cv1;
	Canvas2 cv2;
	
	MouseTest(){
		Frame f=new Frame("Mouse Test");
		f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });

		cv0=new Canvas0(); cv0.setSize(150,300);
		cv1=new Canvas1(); cv1.setSize(150,300);
		cv2=new Canvas2(); cv2.setSize(150,300);
		cls2();
		cv0.addMouseListener(new MyMouseA0());
		cv1.addMouseListener(new MyMouseA1());
		cv2.addMouseListener(new MyMouseA2());

		f.add(cv0,BorderLayout.WEST);
		f.add(cv1,BorderLayout.CENTER);
		f.add(cv2,BorderLayout.EAST);
		f.setSize(450,300);
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new MouseTest();
	}

	void cls2(){
		g2.setColor(Color.BLACK);
		g2.fillRect(0,0, b2.getWidth(), b2.getHeight());
		g2.setColor(Color.WHITE);
		g2.setFont(fnt);
		g2.drawString("Canvas2", 12, 40);
	}
	class Canvas0 extends Canvas {
		private static final long serialVersionUID = 1L;

		@Override
		public void paint(Graphics g){
			g.setColor(Color.WHITE);
			g.fillRect(0, 0, 150, 300);
			g.setColor(Color.BLACK);
			g.setFont(fnt);
			g.drawString("Canvas0", 12, 40);
		}
	}
	class Canvas1 extends Canvas {
		private static final long serialVersionUID = 1L;

		@Override
		public void paint(Graphics g){
			g.setColor(Color.LIGHT_GRAY);
			g.fillRect(0, 0, 150, 300);
			g.setColor(Color.BLACK);
			g.setFont(fnt);
			g.drawString("Canvas1", 12, 40);
		}

	}
	class Canvas2 extends Canvas {
		private static final long serialVersionUID = 1L;
		@Override
		public void paint(Graphics g){
			g.drawImage(b2, 0, 0, null);
		}

	}

	class MyMouseA0 implements MouseListener {
		@Override
		public void mouseClicked(MouseEvent e) {
			int px=e.getX();
			int py=e.getY();
			System.out.printf("Click %d %d\n",px,py);
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			System.out.println("Mouse Entered");
		}

		@Override
		public void mouseExited(MouseEvent e) {
			System.out.println("Mouse Exited");
		}

		@Override
		public void mousePressed(MouseEvent e) {
			System.out.println("Mouse Pressed");
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			System.out.println("Mouse Released");
		}
	}

	class MyMouseA1 extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent e) {
			int px=e.getX();
			int py=e.getY();
			int modi=e.getModifiers();
			if ((modi&MouseEvent.BUTTON1_MASK)!=0) {
				System.out.print("Left ");
			}
			if ((modi&MouseEvent.BUTTON2_MASK)!=0) {
				System.out.print("Center ");
			}
			if ((modi&MouseEvent.BUTTON3_MASK)!=0) {
				System.out.print("Right ");
			}
			System.out.printf("Click %d %d\n",px,py);
		}
	}

	class MyMouseA2 extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent e) {
			int px=e.getX();
			int py=e.getY();
			int modi=e.getModifiers();
			if ((modi&MouseEvent.BUTTON1_MASK)!=0) {
				g2.setColor(Color.BLUE);
				g2.fillOval(px-20, py-20, 39, 39);
				cv2.repaint();
			}
			if ((modi&MouseEvent.BUTTON2_MASK)!=0) {
				cls2();
				cv2.repaint();
			}
			if ((modi&MouseEvent.BUTTON3_MASK)!=0) {
				g2.setColor(Color.YELLOW);
				g2.drawRect(px-20, py-20, 40, 40);
				cv2.repaint();
			}
		}
	}
}

動かすと3つの縦縞が表示されます。
左のCanvas0 のエリアにマウスを入れたり出したり、クリックしたりすると
対応するイベントのメッセージがコンソールに表示されます。

中央のCnavas1 のエリアでは、左右中央のクリックを区別して
対応するメッセージをコンソールに表示します。

右のCanvas2 のエリアは、おまけで、左クリックで青い円、右クリックで
黄色い四角、中央クリックでクリア、するようになっています。

ご意見、ご質問、ご相談などございましたらメールフォームからご連絡ください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)