본문 바로가기

개념 정리/Java

[JAVA] 이벤트, 리스너, key 이벤트, 마우스 이벤트

1. 이벤트 객체

현재 발생한 이벤트에 관한 정보 가진 객체. 이벤트 리스너에 전달됨.

 

[이벤트 처리를 위한 import문]

import java.awt.event.*;	// 이벤트 처리 필요시 import
import javax.swing.event.*;	// 스윙 이벤트 다룰 경우 추가 import

 

[이벤트 객체 메소드]

· getSource()

: 이벤트가 발생된 컴포넌트의 레퍼런스 리턴.

리턴타입은 Object이므로 캐스팅해서 사용하면 됨

JButton b = (JButton)event.getSource();	// b는 이벤트가 발생한 버튼의 레퍼런스

 

[이벤트 객체와 이벤트 발생 경우]

2. 이벤트 리스너

- 이벤트를 처리하는 코드. 컴포넌트에 연결돼있어야 작동함.
- 이벤트 발생할 때마다 이벤트 리스너 실행됨

 

[이벤트 리스너 인터페이스]

 

 

[이벤트 리스너 작성]

ex) 버튼 클릭 시 텍스트 변경하는 이벤트리스너

1. 이벤트와 이벤트 리스너 인터페이스 선택

- 이벤트객체 : ActionEvent- 이벤트 종류 : Action- 이벤트 리스너 : ActionListener

 

2. 이벤트 리스너 클래스 작성

리스너 인터페이스를 상속받는 클래스 작성, 추상메소드 모두 구현

class MyListener implements ActionListener {	// ActionListener 인터페이스 상속
    public void actionPerformed(ActionEvent e){	// 버튼 클릭시 호출되는 메소드
        JButton b = (JButton)e.getSource();	// 클릭된 버튼 알아내기 getSource()
        if(b.getText().equals("Action"))	
        	b.setText("액션");
        else
        	b.setText("Action");
    }
}

 

3. 컴포넌트에 이벤트 리스너 등록

- 이벤트를 처리할 컴포넌트에 이벤트 리스너 등록

- 컴포넌트에 이벤트 리스너 등록 시 add□Listener(listner);  ( □안에 이벤트 이름 넣기)

MyListener listener = new MyListener();	// 리스너 객체 생성
btn.addActionListener(listener);	// 리스너 등록

 

[이벤트 리스너 클래스 작성 방법]

· 독립 클래스로 이벤트 리스너 작성 : 가장 전형적. 리스너 코드가 길 때 적합. 다른 클래스 멤버에 접근 어렵

· 내부 클래스로 이벤트 리스너 작성 : 자신을 둘러싼 클래스의 멤버에 접근 가능

· 익명 클래스로 이벤트 리스너 작성 : new와 함께 사용되어 바로 객체 생성

b.addActionListener(new ActionListener() {		// 위의 코드를 익명클래스 리스너로 작성
    public void actionPerformed(ActionEvent e){
    JButton b = (JButton)e.getSource();
    if(b.getText().equals("Action"))	
        b.setText("액션");
    else
        b.setText("Action");
    }
}

3. 어댑터 클래스

인터페이스를 미리 구현해놓은 클래스
리스너 인터페이스의 모든 메소드를 구현해야 하는 부담을 줄여줌. 

 

[리스너 인터페이스와 어댑터 클래스]

 

사용 예시:

JLabel la;
contentPane.addMouseListener(new MyAdapter());

class MyAdapter extends MouseAdapter {		// MouseAdapter 이용
    public void mousePressed(MouseEvent e) {
    	int x = e.getX();
        int y = e.getY();
        la.setLocation(x,y);
    }
}

4. Key 이벤트

- key 이벤트 : 사용자가 키를 입력할 때 발생하는 이벤트
- 포커스 : 키 입력의 독점권. 현재 포커스를 가진 컴포넌트에만 key 이벤트 전달됨.

 

[컴포넌트에 포커스 주는 법]

↓ 아래 두 코드가 모두 필요함.

· setFoucusable(true) : 컴포넌트가 포커스 받을 수 있도록 설정

· requestFocus() : 컴포넌트에게 포커스 줌

 

- 스윙 프레임이 만들어질 때 컴포넌트에 포커스 주기

: setVisible(true)를 먼저 실행해야 함.

setVisible(true);	// 스윙 프레임 출력
component.setFocusable(true);	// 컴포넌트가 포커스 받을 수 있도록 설정
component.requestFocus();	// 컴포넌트에게 포커스 줌

 

- 사용자가 마우스로 컴포넌트 클릭 시 포커스 얻도록 하기

component.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        Component c = (component)e.getSource();	// 클릭된 컴포넌트
        component.setFocusable(true);	// 컴포넌트가 포커스 받을 수 있도록 설정
		component.requestFocus();	// 클릭된 컴포넌트에게 포커스 줌	
    }
}

 

[key 이벤트 리스너 달기]

component.addKeyListener(myKeyListener);

 

· keyPressed(KeyEvent e)

: 키를 누르는 순간

· keyReleased(KeyEvent e)

: 키를 떼는 순간

· keyTyped(KeyEvent e)

: 누른 키를 떼는 순간(유니코드 키일 때)

 

 

[입력된 키 판별]

· char KeyEvent.getKeyChar()

: 입력된 키의 문자코드 리턴.

public void keyPressed(KeyEvent e) {
    if(e.getKeyChar() == 'q')	// 입력된 키 판별
        System.exit(0);
}

 

· int KeyEvent.getKeyCode()

: 입력된 키의 정수형 키 코드 값 리턴. 리턴한 키 코드와 가상키 값을 비교해야 함.

(가상키: KeyEvent 클래스에 VK_로 시작하는 static 상수)

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_F5)	// F5키 눌러지면 프로그램 종료
    	System.exit(0);
}

 

가상키:

 

· String KeyEvent.getKeyText(int keyCode)

: 키 이름 문자열을 얻을 수 있음. 무슨 키 입력했는지..

5. Mouse 이벤트

* 드래그되는동안 mouseDragged()는 반복적으로 여러번 호출.

 

[마우스 리스너 달기]

- 위 표의 처음 5가지 경우:

component.addMouseListener(myMouseListener);

 

- 드래깅, 무브 이벤트 처리시 MouseMotion 리스너 따로 등록해야됨

component.addMouseMotionListener(myMouseMotionListener);

 

- 마우스 휠 리스너:

component.addMouseWheelListener(myWheelListener);

 

[MouseEvent 객체]

 

·마우스 포인터 위치(x,y)

int getX()	// 마우스 포인터의 x좌표
int getY()	// 마우스 포인터의 y좌표
Point getPoint()	// 마우스 포인터 위치를 Point객체로 리턴. Point객체에 x,y정보 있음

 

·마우스 클릭 횟수

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

 

·마우스 버튼

int getButton()	// 눌러진 마우스 버튼의 번호 리턴
// NOBUTTON, BUTTON1(왼쪽버튼), BUTTON2, BUTTON3(오른쪽버튼)

 

 

 

- 마우스 휠 굴리면 mouseWheelMoved 메소드 호출됨

public void mouseWheelMoved(MouseWheelEvent e)

 

 

명품 JAVA Programming 참고