자바의 Event(이벤트)
마우스로 버튼을 클릭하거나 키보드의 엔터를 치면 어떠한 현상이 일어난다. 이 현상을 바로 이벤트라고 한다. 자바의 이벤트는 3가지 속성으로 구분 할 수 있다.
- Event Source (이벤트 발생지)
버튼, 체크박스, 프레임 등과 같은 컴포넌트들을 건드리거나 그 위에서 동작했을 때 이벤트가 일어나는 컴포넌트 - Event Listener (이벤트 감지기)
이벤트 소스에서 이벤트가 발생하는지 감독하고 있다가 발생할 즉시 이벤트를 처리할 수 있도록 만든 인터페이스 - Event Handler (이벤트 처리기)
실제로 이벤트를 처리하는 코드를 가지고 있으며 이벤트 리스너에 포함되어 있는 메서드로 발생된 이벤트 객체를 받아와 처리
Event Handling (이벤트 처리)
닫기[x]버튼을 눌렀을 때 창이 사라지는 이벤트 처리를 해주지 않으면 아무리 버튼을 눌러도 창은 사라지지 않는다. 고로 이벤트에 대한 수행코드를 작성하여 이벤트 소스에 이벤트 리스너로 등록을 해줘야 한다. 방법은 다음과 같다.
- 이벤트 메서드 중 상황에 적절한 것을 찾는다.
※ 예시로 창을 닫는 이벤트를 들겠다
windowClosing(WindowEvent e)
- 선택한 메서드가 속한 인터페이스를 구현하는 클래스를 작성한다.
class EventHandler implements WindowListener
{
public void WindowClosing(WindowEvent e)
{
코드작성
}
}
- 완성된 클래스의 인스턴스를 생성하여 이벤트 소스에 리스너로 등록한다.
f.addWindowListener(new EventHandler));
진행 과정은 다음과 같다. 닫기 버튼을 누르면,
- WindowEvent가 발생, WindowEvent의 인스턴스가 생성
- 프레임에 WindowListener로 등록된 Event Handler의 WindowClosing 메서드를 호출
자주 사용되는 이벤트
이벤트 | 인터페이스 | 메서드 |
---|---|---|
WindowEvent | WindowListener | windowClosing(WindowEvent e) |
ActionEvent | ActionListener | actionPerformed |
MouseEvent | MouseMotionListener | mouseDragged(MouseEvent e), mouseMoved(MouseEvent e) |
MouseListener | mousePressed(MouseEvent e), mouseClicked(MouseEvent e) | |
KeyEvent | KeyListener | keyPressed, keyReleased, keyTyped(KeyEvent e) |
TextEvent | TextListener | textValueChanged(TextEvent e) |
ItemEvent | ItemListener | itemStateChanged(ItemEvent e) |
리스너를 컴포넌트에 추가/제거하는 메서드
메서드 | 호출 시기 |
---|---|
actionPerformed(ActionEvent e) | 버튼 클릭, 메뉴 클릭, TextField에서 엔터키 클릭, List에서 한가지 더블클릭 등 |
mouseDragged(MouseEvent e) | 마우스로 드래그 |
mouseMoved(MouseEvent e) | 마우스 포인터를 이동 |
keyPressed(KeyEvent e) | 키보드 눌렀을 때 |
keyReleased(KeyEvent e) | 키보드 떼었을 때 |
textValueChanged(TextEvent e) | TextField나 TextArea의 내용이 변경되었을 때 ex) 주민등록번호를 입력하는 칸에서 앞자리 6개의 숫자가 다 차면 다음 칸으로 넘어가게 하는 상황 |
itemStateChanged(ItemEvent e) | Checkbox, CheckboxMenuItem, List, Choice의 status가 변경되었을 때 ex) 체크박스를 체크하거나 체크해제 하는 상황 |
windowClosing(WindowEvent e) | 창을 닫을 때 |
이벤트의 주요 메서드
메서드 | 호출 시기 |
---|---|
Object getItem() | 이벤트가 발생한 item을 반환함 |
Object getSource() | 이벤트 소스를 반환함(EventObject에 정의) |
리스너 - 컴포넌트 짝
리스너 | 이벤트 소스 |
---|---|
ActionListener | Button, List, MenuItem, TextField |
ItemListener | Checkbox, CheckboxMenuItem, List, Choice |
TextListener | TextField, TextArea |
Adaptor 클래스
Event Handler를 작성할 때는 해당 Event Listener에 정의된 모든 추상 메서드를 구현해야 하는데 이러한 불편함을 없애기 위해 고안된 것이 어댑터 클래스이다. 대신 어댑터 클래스를 상속받아서 Event Listener를 직접 구현해야 하며 원하는 메서드만 @Overriding하면 된다. 즉, 어댑터 클래스는 Event Listener에 정의된 메서드를 아무 내용 없이 구현해 놓은 것이다.
얼마나 간단해지는지 비교를 해보자.
//이벤트 리스너를 구현한 것
class KeyHandler implements KeyListener
{
public void keyPressed(KeyEvent e)
{
System.out.println(e.getKeyChar());
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
}
---
//Adapter 클래스를 상속받은 것
class KeyHandler extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
System.out.println(e.getKeyChar());
}
}
만약 Event Listener를 구현해야 한다면 KeyListener(이벤트 리스너)에 있는 모든 메서드를 구현해야 하지만, 어댑터 클래스를 상속 받으면 직접 구현해야 하는 대신 원하는 메서드만을 작성할 수 있어진다!
++이벤트 핸들러 내용 추가 작성 예정
Author And Source
이 문제에 관하여(자바의 Event(이벤트)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nextlinehappy516/자바의-Event이벤트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)