* 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){
...
}
}
'IT > 자바공부' 카테고리의 다른 글
자바 Swing JLabel, 레이블 컴포넌트, 명품자바프로그래밍11장 (0) | 2022.07.26 |
---|---|
자바 스윙 컴포넌트, swing component, 명품자바프로그래밍11장 (0) | 2022.07.26 |
명품자바프로그래밍 10장, 자바의 이벤트 처리 요약 (0) | 2022.07.25 |
자바 KeyEvent & KeyListener, focus, 명품자바프로그래밍10장 (0) | 2022.07.25 |
자바 어댑터 클래스(Adapter), 명품자바프로그래밍10장 (0) | 2022.07.25 |