본문 바로가기

자바공부

자바 Mouse 이벤트, 명품자바프로그래밍10장

728x90
반응형

* Mouse 이벤트는 사용자의 마우스 조작에 따라 총 7가지 경우에 발생한다.

이 중에서 5가지의 경우는 MouseListener의 메소드가 호출되고, 나머지 2가지 경우는 MouseMotionListener의 메소드가 호출된다.

모든 스윙 컴포넌트가 Mouse 이벤트를 받을 수 있다.

Mouse 이벤트가 발생하면 MouseEvent 객체가 생성되며 리스너의 메소드의 인자로 전달된다.

Mouse 이벤트가 발생하는 경우 리스너의 메소드 리스너
마우스가 컴포넌트 위에 올라갈 때 void mouseEntered(MouseEvent e) MouseListener
마우스가 컴포넌트에서 내려올 때 void mouseExited(MouseEvent e) MouseListener
마우스 버튼이 눌러졌을 때 void mousePressed(MouseEvent e) MouseListener
눌러진 버튼이 떼어질 때 void mouseReleased(MouseEvent e) MouseListener
마우스로 컴포넌트를 클릭하였을 때 void mouseClicked(MouseEvent e) MouseListener
마우스가 드래그되는 동안 void mouseDragged(MouseEvent e) MouseMotionListener
마우스가 움직이는 동안 void mouseMoved(MouseEvent e) MouseMotionListener

 

* 마우스가 눌러진 위치에서 그대로 떼어지면 다음 순서로 메소드가 호출된다.

mousePressed(), mouseReleased(), mouseClicked()

 

* 마우스가 드래그되면 다음 순서로 호출된다.

mousePressed(), mouseDragged(), mouseDragged(), mouseDragged(),... mouseDragged(), MouseReleased()

드래그되는 동안 mouseDragged()는 반복적으로 여러 번 호출되며, 눌러진 위치와 떼어진 위치가 달라 mouseClicked()는 호출되지 않는다.

 

* 컴포넌트에 마우스 이벤트 리스너를 등록하기 위해서는 필요에 따라 다음과 같이 MouseListener와 MouseMotionListener를 따로 등록해야 한다. 이 경우는 component가 마우스가 눌러진 경우와 드래깅을 모두 처리하고자 하는 경우이다.

component.addMouseListener(myMouseListener);
compoenet.addMouseMotionListener(myMouseMotionListener);

 

* mouseClicked()와 mouseReleased()는 둘 다 마우스 버튼이 떼어지는 순간에 호출되는 메소드이지만 서로 다르다.

mouseClicked()는 마우스가 눌러진 위치에서 그대로 떼어질 때 호출된다. 하지만 mouseReleased()는 마우스가 눌러진 위치와 떼어진 위치가 같든 다르든 항상 호출된다. 하물며 마우스가 눌러진 컴포넌트를 벗어나는 경우에도 호출된다.

 

* MouseEvent 객체는 Mouse 이벤트가 발생한 상황 정보를 제공하는 개체이다.

 

* 마우스 포인터의 위치 메소드

int getX(); // 마우스 포인터의 x 위치 리턴
int getY();	// 마우스 포인터의 y 위치 리턴
Point getPoint(); // 마우스 포인터의 위치를 Point 객체로 리턴

// 눌러진 마우스의 위치(x,y)
public void mousePressed(MouseEvent e){
    int x = e.getX();
    int y = e.getY();
}

 

* 마우스 클릭 횟수

int getClickCount(); // 마우스의 클릭 횟수 리턴

// 더블클릭을 처리하는 루틴
public void mouseClicked(MouseEvent e){
	if(e.getClickCount() == 2){
    	...
    }
}

 

* 눌러진 마우스 버튼을 리턴하는 메소드

int getButton(); // 눌러진 마우스 버튼의 번호를 리턴한다.
// 리턴 값은 NOBUTTON, BUTTON1(마우스 왼쪽), BUTTON2, BUTTON3(마우스 오른쪽) 중의 하나이다

// 왼쪽 버튼 눌렸는지 판단하는 소스
public void mousePressed(MouseEvent e){
	if(e.getButton == MouseEvent.BUTTON1)
    	Sysout.out.println("Left Button Pressed");
}

 

* 7가지 마우스 처리 예시

package Ch10;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MouseListenerALLEx extends JFrame{
	JPanel contentPane = new JPanel();
	JLabel la;
	
	MouseListenerALLEx(){
		setTitle("MouseListener와 MouseMotionListener 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setContentPane(contentPane);
		
		// MouseListener 리스너 등록
		contentPane.addMouseListener(new MyMouseListener());
		// MouseMotionListener 리스너 등록
		contentPane.addMouseMotionListener(new MyMouseListener());
		
		la = new JLabel("No Mouse Event");
		contentPane.add(la);
		setSize(300,200);
		setVisible(true);
	}
	
	// Mouse 리스너와 MouseMotion 리스너를 모두 가진 리스너 구현
	class MyMouseListener implements MouseListener, MouseMotionListener{
		// MouseListener의 5개 메소드 구현
		public void mousePressed(MouseEvent e) {
			la.setText("MousePressed("+e.getX()+","+e.getY()+")");	
		}
		public void mouseReleased(MouseEvent e) {
			la.setText("MouseReleased("+e.getX()+","+e.getY()+")");
		}
		public void mouseClicked(MouseEvent e) {
			
		}
		public void mouseEntered(MouseEvent e) {
			JPanel p = (JPanel)e.getSource();
			p.setBackground(Color.CYAN);
		}
		public void mouseExited(MouseEvent e) {
			JPanel p = (JPanel)e.getSource();
			p.setBackground(Color.YELLOW);
		}
		// MouseMotionListener의 2개 메소드 구현
		public void mouseDragged(MouseEvent e) {
			la.setText("MouseDragged("+e.getX()+","+e.getY()+")");
		}
		public void mouseMoved(MouseEvent e) {
			la.setText("MouseMoved("+e.getX()+","+e.getY()+")");
		}
		
	}
	
	public static void main(String[] args) {
		new MouseListenerALLEx();
	}
}

 

* 마우스 휠을 굴리면 MouseWheelEvent가 발생하며, MouseWheelListener 인터페이스가 가진 유일한 다음 메소드가 호출된다.

public void mouseWheelMoved(MouseWheelEvenet e)

// 휠의 움직임을 처리하는 코드
component.addMouseWHeelListener(new MouseWheelListener()){
	public void mouseWheelMoved(MouseWheelEvent e){
    	...
    }
}
반응형