본문 바로가기

자바공부

자바 이벤트 처리, 명품자바프로그래밍10장

728x90
반응형

* 이벤트 기반 프로그래밍은 이벤트의 발생에 의해 프로그램 실행 흐름이 결정되는 방식의 프로그래밍 패러다임이다.

이벤트는 키 입력, 마우스 클릭, 마우스 드래그 등 사용자의 액션이나 센서 등 외부 장치로부터의 입력, 네트워크를 통한 다른 컴퓨터로부터의 데이터 수신, 다른 스레드나 프로그램으로부터의 메시지 수신 등에 의해 발생한다.

 

* 이벤트 기반 응용프로그램은 각 이벤트를 처리하는 이벤트 리스너(event listener) 혹은 이벤트 핸들러를 보유하며 이벤트가 발생할 때마다 해당 이벤트 리스너가 실행된다.

사용자가 스윙 기반의 GUI 응용프로그램상에서 버튼 클릭등의 GUI 컴포넌트에 입력 행위를 하면 이벤트가 발생한다.

 

* new 버튼이 클릭되어 처리되는 과정을 통해 이벤트가 발생하는 과정

1) 사용자가 마우스로 화면의 New 버튼을 클릭한다.

2) 버튼 클릭은 운영체제의 마우스 드라이버를 거쳐 자바 가상 기계에 전달된다.

3) 자바 가상 기계는 이벤트 분배 스레드(Event Dispatch Thread)에게 마우스 클릭에 관한 정보를 보낸다.

4) 이벤트 분배 스레드는 이벤트(Action) 객체를 생성한다. 이벤트를 발생시키게 된 버튼 컴포넌트의 레퍼런스를 이벤트 객체 내에 저장한다. 이벤트를 발생시킨 버튼 컴포넌트를 이벤트 소스(Event Source)라고 부른다.

5) 이벤트 분배 스레드는 이벤트를 처리할 '이벤트 리스너4'를 찾고 실행한다.

6) 이벤트 분배 스레드는 '이벤트 리스너4'로부터 리턴한 후 다음 이벤트 발생을 기다린다.

자바 SWING GUI 응용프로그램의 이벤트 처리 과정

* 이벤트 소스

이벤트를 발생시킨 GUI 컴포넌트이다. (ex. New 버튼)

 

* 이벤트 객체

이벤트 발생 시 이벤트 종류, 이벤트 소스, 이벤트가 발생한 화면의 좌표, 마우스 버튼 종류, 눌러진 키의 코드 값 등 

이벤트에 대한 여러 속성 값을 가진 객체이다.

 

* 이벤트 리스너(Event Listener)

이벤트를 처리하는 코드로서 컴포넌트에 등록되어야 작동 가능하다.

 

* 이벤트 분배 스레드(Event Dispatch Thread)

이벤트 기반 프로그래밍의 핵심 요소로서 무한 루프를 실행하는 스레드이다.

자바 가상 기계로부터 이벤트의 발생을 통지받으면 이벤트 소스와 이벤트 종류를 결정하고, 이에 따라 이벤트 객체를 생성하며 이벤트 리스너를 찾아 호출한다.

 

* 자바에서는 이벤트는 이벤트 분배 스레드에 의해 하나씩 도착하는 순서대로 처리된다.

이로 인해 마우스의 움직임이나 키 입력이 지연되는 일이 일어날 수 있기 때문에 이벤트 리스너는 가능하면 짧게 작성하여야 하며, 길어지게 되는 경우 따로 스레드를 만들어 해결하여야 한다.

 

* 이벤트 객체는 발생한 이벤트에 관한 여러 정보를 가진 객체이며 이벤트 핸들러에게 전달된다.

모든 이벤트 객체들은 java.util.EventObject 클래스를 상속받으며 ListSelectionEvent를 제외하고 java.awt.event 패키지에 구현되어 있다. 이벤트를 처리하기 위해 응용프로그램은 반드시 import라인에 포함하여야한다.

import java.awt.event.*; // 이벤트 처리가 필요한 모든 소스에 포함
import javax.swing.event.*; // 스윙 이벤트를 다루는 경우에 추가 포함

이벤트 객체의 종류 및 상속 관계

* 이벤트 객체는 메소드를 통해 이벤트를 정보를 제공한다.

1) 이벤트 종류

2) 이벤트 소스

3) 이벤트가 발생한 화면 좌표

4) 이벤트가 발생한 컴포넌트 내 좌표

5) 버튼이나 메뉴 아이템에 이벤트가 발생한 경우 버튼이나 메뉴 아이템의 문자열

6) 클릭된 마우스 버튼 번호

7) 키가 눌러졌다면 키의 코드 값과 문자 값

8) 체크박스, 라디오버튼 등과 같은 컴포넌트에 이벤트가 발생하였다면 체크 상태

 

Object getSourde()

현재 발생한 이벤트의 이벤트 소스 컴포넌트의 레퍼런스를 리턴한다. 

모든 이벤트 객체는 EventObject의 getSource() 메소드를 공통적으로 상속받는다.

Object 타입을 리턴하므로 캐스팅하여 사용하여야 한다.

이벤트 객체의 메소드

 

* 이벤트 객체와 이벤트 소스 그리고 이벤트가 발생하는 경우

이벤트 객체 이벤트 소스 이벤트가 발생하는 경우
ActionEvent JButton 마우스나 키로 버튼 선택
JList 리스트 아이템을 더블클릭하여 리스트 아이템 선택
JMenuItem 메뉴 아이템 선택
JTextField 텍스트 입력 중 <Enter> 키 입력
ItemEvent JCheckBox 체크박스의 선택 혹은 해제
JCheckBoxMenuItem 체크박스 메뉴 아이템의 선택 혹은 해제
JList 리스트 아이템 선택
KeyEvent Component 키가 눌러지거나 눌러진 키가 떼어질 때
MouseEvent Component 마우스 버튼이 눌러지거나 때어질 때,
마우스 버튼이 클릭될 때,
컴포넌트 위에 마우스가 올라갈 때,
올라간 마우스가 내려 올 때,
마우스가 드래그 될 때,
마우스가 단순히 움직일 때

FocusEvent Component 컴포넌트가 포커스를 받거나 잃을 때

TextEvent TextField 텍스트 변경
TextArea 텍스트 변경
WindowEvent Window Window를 상속ㄷ받는 모든 컴포넌트에 대해 윈도우 활성화, 비활성화, 아이콘화, 아이콘에서 복구, 윈도우 열기, 윈도우 닫기, 윈도우 종료
AdjustmentEvent JScrollBar 스크롤바를 움직일 때
ComponentEvent Component 컴포넌트가 사라지거나, 나타나거나, 이동하거나, 크기가 변경 될 때
ContainerEvenet Container Container에 컴포넌트의 추가 혹은 삭제
반응형