MouseEvent와 MouseListener, MouseMotionListener, MouseWheelListener
Mouse 이벤트
Mouse 이벤트는 사용자의 마우스 조작에 따라 총 8가지 경우에 발생합니다. 이 중에서 5가지 경우는 MouseListener의 메서드가 호출되고, 2가지 경우는 MouseMotionListener의 메소드가, 나머지 1가지는 MouseWheelListener의 메소드가 호출됩니다. 모든 스윙 컴포넌트가 Mouse 이벤트를 받을 수 있으며, Mouse 이벤트가 발생하면 MouseEvent 객체나 MouseWheelEvent 객체가 리스너의 메서드에 전달됩니다.

마우스가 눌러진 위치에서 그대로 떼어지면 다음 순서로 메서드가 호출됩니다.
mousePressed(), mouseReleased(), mouseClicked()
하지만 마우스가 드래그되면 다음 순서로 호출됩니다.
mousePressed(), mouseDragged(), ..., mouseDragged(), mouseReleased()
드래그되는 동안 mouseDragged()는 반복적으로 여러 번 호출되며, 눌러진 위치와 떼어진 위치가 달라 moseClicked()는 호출되지 않습니다.
마우스 리스너 달기
마우스 리스너를 작성하고 달 때 조심해야 하는 점이 있습니다. 처음 5가지 경우 (mouseEntered(), mouseExited(), mouseReleased(), mouseClicked())의 Mouse 이벤트를 처리하고자 한다면, Mouse 리스너를 작성하여 컴포넌트에 다음과 같이 등록합니다.
component.addMouseListener(myMouseListener);
그러나 동일한 컴포넌트가 마우스 드래깅(mouseDragged())과 마우스 무브 (mouseMoved()) 이벤트도 함께 처리하고자 하면, 다음과 같이 MouseMotion 리스너를 바로 등록해여 합니다.
component.addMouseMotionListener(myMouseMotionListener);
MouseEvent 객체
MouseEvent 객체는 Mouse 이벤트나 MouseMotion 이벤트 정보를 제공하는 객체입니다. MouseEvent 객체의 메소드를 이용하여 이벤트 정보를 얻어냅니다.
마우스 포인터의 위치
다음 메서드는 컴포넌트 안에 마우스가 놓인 좌표를 제공합니다.
int getX() // 마우스 포인터의 x 위치 리턴
int getY() // 마우스 포인터의 y 위치 리턴
Point getPoint() // 마우스 포인터의 위치를 Point 객체로 리턴, point 객체에 x, y 정보 있음
마우스의 위치 (x, y)는 다음과 같이 알아내며, (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 중의 하나이며,
// 마우스 왼쪽 버튼은 BUTTON1이고 오른쪽 버튼은 BUTTON2입니다.
getButton() 메서드를 이용하여 마우스 왼쪽 버튼이 눌러졌는지 다음과 같이 판단할 수 있습니다.
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1)
System.out.println("left Button Pressed");
}
Mouse 이벤트 처리 예
마우스와 마우스 모션 이벤트 활용
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class MouseListenerAllEx extends JFrame {
private JLabel la = new JLabel("No Mouse Event"); // 메시지 출력 레이블 컴포넌트
public MouseListenerAllEx() {
setTitle("MouseListener와 MouseMotionListener 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
MyMouseListener listener = new MyMouseListener(); // 리스너 객체 생성
c.addMouseListener(listener); // MouseListener 리스너 등록
c.addMouseMotionListener(listener); // MouseMotionListener 리스너 등록
c.add(la);
setSize(300, 200);
setVisible(true);
}
// 마우스 리스너와 MouseMotion 리스너를 모두 가진 리스너 작성
class MyMouseListener implements MouseListener, MouseMotionListener {
// MouseListener의 5개 메소드 구현
public void mousePressed(MouseEvent e) {
la.setText("Mouse Pressed (" + e.getX() + ", " + e.getY() + ")"); // 마우스가 눌러진 위치 (x, y) 점을 출력
}
public void mouseReleased(MouseEvent e) {
la.setText("Mouse Released (" + e.getX() + ", " + e.getY() + ")"); // 마우스가 떼어진 위치 (x, y) 점을 출력
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
Component c = (Component) e.getSource(); // 마우스가 올라간 컴포넌트를 밀어낸다.
c.setBackground(Color.CYAN);
}
public void mouseExited(MouseEvent e) {
Component c = (Component) e.getSource(); // 마우스가 내려간 컴포넌트를 알아낸다.
c.setBackground(Color.YELLOW);
}
// MouseMotionListener의 2개 메서드 구현
public void mouseDragged(MouseEvent e) { // 마우스가 드래깅되는 동안 계속 호출
la.setText("Mouse Dragged (" + e.getX() + ", " + e.getY() + ")");
}
public void mouseMoved(MouseEvent e) { // 마우스가 움직이는 동안 계속 호출
la.setText("Mouse Moved (" + e.getX() + ", " + e.getY() + ")");
}
}
public static void main(String[] args) {
new MouseListenerAllEx();
}
}
[실행 결과]






더블클릭할 때마다 컨텐트팬의 배경색이 랜덤하게 변하는 예
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ClickAndDoubleClickEx extends JFrame {
public ClickAndDoubleClickEx() {
setTitle("Click and Double Click 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.addMouseListener(new MyMouseListener()); // Mouse 리스너 열기
setSize(300, 200);
setVisible(true);
}
// MouseAdapter를 상속받아 Mouse 리스너 구현
class MyMouseListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) { // 더블클릭의 경우
// [0, 255] 사이의 랜덤한 r, g, b 점수 값 얻기
int r = (int) (Math.random() * 256);
int g = (int) (Math.random() * 256);
int b = (int) (Math.random() * 256);
Component c = (Component) e.getSource(); // 마우스가 클릭된 컴포넌트
c.setBackground(new Color(r, g, b)); // 배경을 r, g, b 색으로 칠한다.
}
}
}
public static void main(String[] args) {
new ClickAndDoubleClickEx();
}
}
[실행 결과]



MouseWheelEvent와 MouseWheelListener
마우스 힐을 굴리면 MouseWheelListener가 발생하며, MouseWheelListener 인터페이스가 가진 유일한 다음 메소드가 호출됩니다.
public void mouseWheelMoved(MouseWheelEvent e)
다음은 마우스 힐 이벤트를 처리하는 리스너를 익명 클래스로 만든 사례입니다.
component.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
// 휠의 움직임에 따라 이벤트를 처리합니다.
}
});'프로그래밍 언어 > JAVA' 카테고리의 다른 글
| JLabel, 레이블 컴포넌트 (0) | 2025.06.23 |
|---|---|
| 스윙 컴포넌트 소개 (2) | 2025.06.20 |
| KeyEvent와 KeyListener (1) | 2025.06.14 |
| 어댑터(Adapter) 클래스 (1) | 2025.06.11 |
| 이벤트 리스너 (1) | 2025.06.08 |