자바에서 마우스 이벤트를 처리할 때 MouseListener 인터페이스는 마우스가 정지 상태일 때 발생하는 이벤트를 다루는 데 사용하고, MouseMotionListener 인터페이스는 마우스가 움직이는 상태일 때 발생하는 이벤트를 처리하는 데 사용합니다.
MouseListener란?
소스 객체 위에서 마우스 버튼(왼쪽 또는 오른쪽)을 누르거나(press), 놓거나(release), 클릭하거나(click, 누른 후 놓는 동작) 할 때, 또는 마우스 포인터가 소스 객체에 진입(enter)하거나 이탈(exit)할 때 MouseEvent가 발생합니다.
MouseListener 인터페이스는 다음과 같은 다섯 개의 추상 메서드를 선언하고 있습니다.
문법(Syntax)
public void mouseClicked(MouseEvent evt) public void mousePressed(MouseEvent evt) public void mouseReleased(MouseEvent evt) public void mouseEntered(MouseEvent evt) public void mouseExited(MouseEvent evt)
- mouseClicked(): 마우스 버튼을 눌렀다가 놓았을 때 호출됩니다.
- mousePressed(): 마우스 버튼을 누르는 순간 호출됩니다.
- mouseReleased(): 눌렀던 마우스 버튼을 놓는 순간 호출됩니다.
- mouseEntered(): 마우스 포인터가 컴포넌트 영역 안으로 들어올 때 호출됩니다.
- mouseExited(): 마우스 포인터가 컴포넌트 영역 밖으로 나갈 때 호출됩니다.
예제 코드
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseListenerTest extends JFrame implements MouseListener {
private JTextField tfMouseX, tfMouseY;
public MouseListenerTest() {
setLayout(new FlowLayout());
add(new Label("X-Click: "));
tfMouseX = new JTextField(10);
tfMouseX.setEditable(false);
add(tfMouseX);
add(new Label("Y-Click: "));
tfMouseY = new JTextField(10);
tfMouseY.setEditable(false);
add(tfMouseY);
addMouseListener(this);
setTitle("MouseListener Test");
setLocationRelativeTo(null);
setSize(350, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new MouseListenerTest();
}
@Override
public void mouseClicked(MouseEvent evt) {
tfMouseX.setText(evt.getX() + "");
tfMouseY.setText(evt.getY() + "");
}
// 컴파일을 위해 빈 메서드 본문 제공
@Override public void mousePressed(MouseEvent evt) { }
@Override public void mouseReleased(MouseEvent evt) { }
@Override public void mouseEntered(MouseEvent evt) { }
@Override public void mouseExited(MouseEvent evt) { }
}실행 결과

위 예제를 실행한 후 프레임 내부를 클릭하면 클릭된 지점의 X, Y 좌표가 각각의 텍스트 필드에 표시됩니다.
MouseMotionListener란?
소스 객체 위에서 마우스 포인터를 이동(move)하거나 드래그(drag)할 때도 MouseEvent가 발생합니다. 하지만 이러한 마우스 이동 및 드래그 이벤트를 처리하려면 반드시 MouseMotionListener를 사용해야 합니다.
MouseMotionListener 인터페이스는 다음 두 가지 추상 메서드를 선언합니다.
문법(Syntax)
public void mouseDragged(MouseEvent e) public void mouseMoved(MouseEvent e)
- mouseMoved(): 버튼을 누르지 않은 상태로 마우스를 움직일 때 호출됩니다.
- mouseDragged(): 마우스 버튼을 누른 채로 마우스를 움직일 때 호출됩니다.
예제 코드
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseMotionListenerTest extends JFrame implements MouseListener, MouseMotionListener {
private JTextField tfMouseClickX, tfMouseClickY;
private JTextField tfMousePositionX, tfMousePositionY;
public MouseMotionListenerTest() {
setLayout(new FlowLayout());
add(new Label("X-Click: "));
tfMouseClickX = new JTextField(10);
tfMouseClickX.setEditable(false);
add(tfMouseClickX);
add(new Label("Y-Click: "));
tfMouseClickY = new JTextField(10);
tfMouseClickY.setEditable(false);
add(tfMouseClickY);
add(new JLabel("X-Position: "));
tfMousePositionX = new JTextField(10);
tfMousePositionX.setEditable(false);
add(tfMousePositionX);
add(new JLabel("Y-Position: "));
tfMousePositionY = new JTextField(10);
tfMousePositionY.setEditable(false);
add(tfMousePositionY);
addMouseListener(this);
addMouseMotionListener(this);
setTitle("MouseMotionListener Test");
setSize(400, 120);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new MouseMotionListenerTest();
}
@Override
public void mouseClicked(MouseEvent evt) {
tfMouseClickX.setText(evt.getX() + "");
tfMouseClickY.setText(evt.getY() + "");
}
// 컴파일을 위해 빈 메서드 본문 제공
@Override public void mousePressed(MouseEvent evt) { }
@Override public void mouseReleased(MouseEvent evt) { }
@Override public void mouseEntered(MouseEvent evt) { }
@Override public void mouseExited(MouseEvent evt) { }
@Override
public void mouseMoved(MouseEvent evt) {
tfMousePositionX.setText(evt.getX() + "");
tfMousePositionY.setText(evt.getY() + "");
}
// 컴파일을 위해 빈 메서드 본문 제공
@Override public void mouseDragged(MouseEvent evt) { }
}실행 결과

이 예제는 하나의 클래스가 MouseListener와 MouseMotionListener를 모두 구현하는 형태입니다. 프레임 위에서 마우스를 클릭하면 클릭 좌표가, 마우스를 단순히 움직이면 실시간 위치 좌표가 각각의 텍스트 필드에 출력됩니다.
두 리스너의 핵심 차이점 요약
| 구분 | MouseListener | MouseMotionListener |
|---|---|---|
| 처리 대상 | 클릭, 누름, 놓음, 진입, 이탈 | 이동(move), 드래그(drag) |
| 마우스 상태 | 정지 상태에서의 이벤트 | 움직이는 상태에서의 이벤트 |
| 추상 메서드 수 | 5개 | 2개 |
정리하면, 버튼 클릭이나 진입/이탈 같은 '정적인' 마우스 동작은 MouseListener로, 이동이나 드래그 같은 '동적인' 마우스 동작은 MouseMotionListener로 처리하는 것이 자바 스윙(Swing) 프로그래밍의 기본 원칙입니다.