31
JAVA 프로그래밍 9. 이벤트 처리 한동일 2/62 학습 목표 To understand the Java event model To learn about the relations between components and events To install action and mouse event listeners To accept input from buttons, text fields, and the mouse To learn about adapter class

JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

JAVA 프로그래밍

9. 이벤트 처리

한 동 일

2/62

학습 목표

To understand the Java event model

To learn about the relations between components and events

To install action and mouse event listeners

To accept input from buttons, text fields, and the mouse

To learn about adapter class

Page 2: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

3/62

프로그램은 사용자와 상호 작용하기 위하여 사용자의 요

구(이벤트)를 감지할 수 있어야 함

이벤트의 발생

사용자의 행동

마우스 드래그, 누르기, 클릭, 움직임

키보드의 누르기, 떼기 등

프로그램 내부

프로그램 내부의 타이머

센서 입력, 네트워크 데이터의 송수신

다른 응용프로그램이나 스레드로부터의 메시지 등

자바에서는 이벤트를 객체로 취급

이벤트(Event)란?

4/62

마우스로 버튼 클릭(Mouse Event,Action Event)

마우스로윈도우 크기 조절(Mouse Event,Container Event)

키보드 입력(Key Event)

키보드로 메뉴선택(Key Event,Action Event)

마우스로 메뉴선택(Mouse Event,Action Event)

이벤트의 예

Page 3: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

5/62

이벤트의 발생에 의해서 프로그램의 흐름이 결정(event

driven programming)

이벤트가 발생되면 이벤트를 처리하는 루틴(이벤트 청취자)이

실행되는 방식

프로그램 내의 어떤 코드가 언제 실행될 지는 알 수 없음

이벤트의 발생에 의해서 프로그램의 실행이 결정

반대개념 : 배치 프로그래밍(batch programming)

프로그램 개발자가 프로그램의 흐름을 결정

자바의 이벤트 처리 방식

delegation event model(이벤트 전달 모델,이벤트 위임 모델)

이벤트 소스에서 발생된 이벤트의 처리를 다른 객체에게 위

임하는 이벤트 처리 방식

이벤트 기반 프로그래밍

6/62

이벤트 발생처(Event Source)

특정 이벤트를 발생시키는 사용자 인터페이스 컴포넌트

이벤트 발생시 해당 이벤트 청취자에게 그 사실을 통보

각 컴포넌트에서 청취자의 유무와 관계없이 자동적으로 이벤트를 발

생시킴

이벤트 청취자(Event Listener)

이벤트의 처리를 담당

응용 프로그래머가 제공하는 클래스에 속함

이벤트 발생 시 동작들을 메소드로 구현

프로그램 구현

청취자 인터페이스(Listener Interface)

어댑터 클래스(Adapter Class, 적응기 클래스)

이벤트 발생처, 청취자

Page 4: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

7/62

이벤트 전달 모델

이벤트 전달 모델(이벤트 위임 모델) GUI의 컴포넌트에서 이벤트가 발생되면 해당되는 청취자(listener)에

게 이벤트 처리를 넘겨주는 방식

이벤트 처리를 위한 컴포넌트에는 해당 청취자가 등록되어있어야 함

청취자에는 이벤트를 처리할 처리루틴이 포함되어 있어야함

GUI 컴포넌트

청취자 청취자 청취자

이벤트 발생발생된 이벤트에 따라 해당 청취자에 이벤트 전달

컴포넌트에 등록된 청취자 들

8/62

EventObject

ComponentEvent ItemEventAdjustmentEventActionEvent TextEvent

AWTEvent

InputEventContainerEvent PaintEvent WindowEventFocusEvent

MouseEvent KeyEvent

ListSelectionEventjava.awt.AWTEvent

java.util.EventObject

java.awt.event.*

javax.swing.event.ListSelectionEvent

이벤트 클래스 계층 구조 자바는 다양한 이벤트와 관련된 이벤트 클래스들을 java.awt.event 패

키지로 제공

각 컴포넌트들은 다양한 이벤트를 발생

JVM은 사용자의 조작에 따라 적합한 이벤트를 발생(관련 클래스로부터 이벤트 객체 생성)

이벤트 객체의 종류

Page 5: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

9/62

이벤트 객체와 이벤트 소스이벤트 객체 이벤트 소스 이벤트가 발생하는 경우

ActionEvent

JButton 마우스로 버튼을 클릭하거나 키로 버튼을 선택한 경우

JList 리스트 아이템을 더블클릭하여 리스트 아이템을 선택한 경우

JMenuItem 메뉴 아이템 선택을 선택한 경우

JTextField 텍스트 입력 중 <Enter> 키를 누른 경우

ItemEvent

JCheckBox 체크박스의 선택 혹은 해제

JCheckBoxMenuItem 체크박스 메뉴 아이템이 선택 혹은 해제 될 때

JList 리스트 아이템이 선택될 때

KeyEvent Component 모든 컴포넌트에 대해, 키가 눌러지거나 눌러진 키가 떼어질 때

MouseEvent Component모든 컴포넌트에 대해, 마우스 버튼이 눌러지거나 떼어질 때, 클릭될 때, 컴포넌트 위에마우스가 올라갈 때, 올라간 마우스가 내려올 때, 마우스가 드래그될 때, 마우스가 단순움직일 때

FocusEvent Component 모든 컴포넌트에 대해, 컴포넌트가 포커스를 받거나 잃을 때

TextEventTextField 텍스트가 변경될 때

TextArea 텍스트가 변경될 때

WindowEvent WindowWindow를 상속받는 모든 컴포넌트에 대해, 윈도우가 활성화, 비활성화, 아이콘화, 아이콘에서 복구 될 때, 윈도우가 열리거나 닫힐 때, 윈도우가 종료될 때 등

AdjustmentEvent JScrollBar 스크롤바를 사용자가 움직였을 때

ComponentEvent Component 모든 컴포넌트에 대해, 컴포넌트가 사라지거나, 나타나거나, 이동 하거나 크기 변경 될 때

ContainerEvent Container Container에 컴포넌트가 추가 혹은 삭제되었을 때

10/62

Event Action adjust- compo- conta- focus item key mouse mouse- text windowType event ment nent iner event event event event wheel event event

이벤트 소스와 이벤트 객체

Page 6: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

11/62

ActionEvent

발생 상황 Button : 마우스로 클릭했을 때

List : 아이템 선택/이미 선택되어 있는 아이템의 선택을 해제했을 때

MenuItem : 메뉴에서 메뉴아이템을 선택했을 때

TextField : 텍스트필드에서 엔터 키를 눌렀을 때

이벤트가 발생하였을 때 같이 사용된 수정자 키를 구분하기 위해 4개의 상수를 제공 ALT_MASK 수정자 키로 ALT키를 사용

CTRL_MASK 수정자 키로 CTRL키를 사용

META_MASK 수정자 키로 META키를 사용

SHIFT_MASK 수정자 키로 SHIFT키를 사용

12/62

ActionEvent

생성자 ActionEvent(Object src, int id, String cmd)

ActionEvent(Object src, int id, String cmd, int modifiers) src : 이벤트를 발생한 객체 id : 이벤트의 유형

cmd : 이벤트를 발생시킨 컴포넌트의 레이블

modifiers : 이벤트가 발생할 때 같이 사용된 수정키를 의미하는 상수

메소드

String getActionCommand() ActionEvent를 발생시킨 객체의 이름을 반환한다. 예를 들어 버튼이

눌려져서 이벤트가 발생하였다면, 이 메소드는 버튼의 레이블을 문자열로 반환한다.

int getModifiers() 이벤트 발생시 같이 사용된 수정자키를 (ALT, CTRL, META, SHIFT)

나타내는 상수 값을 반환한다.

Page 7: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

13/62

AdjustmentEvent

발생 상황 스크롤바의 값이 변경되었을 때

5가지의 유형을 구분하기 위해 상수 제공 BLOCK_DECREMENT 스크롤 바의 값을 감소시키는 경우

BLOCK_INCREMENT 스크롤 바의 값을 증가시키는 경우

TRACK 스크롤 바를 드래그(drag) 하는 경우

UNIT_INCREMENT 스크롤 바의 값을 상향 버튼을 사용하여 증가시키는 경우

UNIT_DECREMENT 스크롤 바의 값을 하향 버튼을 사용하여 감소시키는 경우

14/62

AdjustmentEvent

생성자 AdjustmentEvent(Adjustable src, int id, int type, int data)

src : 이벤트를 발생시킨 객체

id : 이벤트의 유형을 구분하기 위해 사용되는 상수

type : adjustment의 유형을 의미

data : 이벤트와 관련된 데이터 즉 스크롤 바의 이동 값

메소드 Adjustable getAdjustable() 이벤트를 발생시킨 객체를 반환

int getAdjustmentType() adjustment의 유형을 반환

int getValue() 스크롤의 이동 값을 반환

Page 8: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

15/62

ComponentEvent

발생 상황 MenuItem과 CheckboxMenuItem을 제외한 모든 컴포넌트에서

발생

컴포넌트가 감춰지거나, 감춰진 상태에서 다시 나타날 때, 이동하였을 때, 크기를 조정하였을 때 발생

4가지 유형을 위한 상수 COMPONENT_HIDDEN 컴포넌트가 감추어질 때

COMPONENT_SHOWN 감추어진 컴포넌트가 다시 나타날 때

COMPONENT_MOVED 컴포넌트가 이동하였을 때

COMPONENT_RESIZED 컴포넌트의 크기가 변동되었을 때

16/62

생성자

ComponentEvent(Component src, int id) src : 이벤트를 생성된 컴포넌트 객체를 의미

Id : 이벤트의 유형을 의미

메소드 Component getComponent() 이벤트를 발생시킨 컴포넌트

를 반환

ComponentEvent

Page 9: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

17/62

ContainerEvent 발생 상황

컨테이너에 컴포넌트가 추가되거나 제거될 때 발생

2가지 유형을 위한 상수 COMPONENT_ADDED 컴포넌트가 컨테이너에 추가될 때

COMPONENT_REMOVED 컴포넌트가 컨테이너에서 제거될 때

생성자 ContainerEvent(Component src, int id, Component comp)

src : 이벤트를 발생시킨 객체를 의미

id : 이벤트의 유형을 의미

comp : 컨테이너에 추가되거나 제거된 컴포넌트를 의미

메소드 Container getContainer() 이벤트를 발생시킨 컨테이너를 반환

Component getChild() 컨테이너에 추가되거나 제거된 컴포넌트를 반환

18/62

FocusEvent

발생 상황 컴포넌트가 입력 포커스를 얻거나 잃을 때 발생

2가지 유형을 위한 상수 FOCUS_GAINED 컴포넌트가 입력의 초점을 얻었을 때

FOCUS_LOST 컴포넌트가 입력의 초점을 잃었을 때

생성자 FocusEvent(Component src, int id)

src : 이벤트를 발생시킨 컴포넌트

id : 이벤트의 유형

Page 10: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

19/62

ItemEvent

발생 상황 체크박스나 리스트 항목이 선택되었을 때, 선택 메뉴의 한 항목

이 선택되었을 때, 선택된 항목이 해제될 때 발생

이벤트의 유형을 구분하기 위한 2개의 상수 제공 SELECTED 한 항목이 선택되었을 때

DESELECTED 선택된 항목이 해제되었을 때

20/62

생성자 ItemEvent(ItemSelectable src, int id, Object item, int state)

src : 이벤트를 발생시킨 컴포넌트

id : 이벤트의 유형

item : 이벤트 발생시 전달하고자 하는 특수한 item 객체를 의미

state : item의 현재 상태를 의미

메소드 Object getItem() 이벤트를 발생시킨 객체를 반환

ItemSelectable getItemSelectable() 이벤트를 발생시킨 ItemSelectable 객체를 반환

리스트나 선택메뉴 등은 ItemSelectable 인터페이스를 이용하여 구현

int getStateChange() 이벤트의 발생으로 변환된 상태를 상수로반환

ItemEvent

Page 11: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

21/62

KeyEvent

발생 상황 키가 눌리거나(pressed), 다시 놓이거나(released) 또는 타이프

(pressed and released) 되었을 때

이벤트의 유형을 구분하기 위한 3개의 상수 제공 KEY_PRESSED 키가 눌려졌을 때

KEY_RELEASED 키가 띠어졌을 때

KEY_TYPED 키에 의해 문자가 생성되었을 때

입력되는 문자를 구분하기 위한 상수제공 VK_0 - VK_9, VK_A - VK_Z, VK_F1 - VK_F24,

VK_LEFT, VK_UP, VK_ENTER, VK_ESCAPE, VK_CANCEL 등

22/62

생성자 KeyEvent(Component src, int id, long when, int modifiers, int cod

e)

KeyEvent(Component src, int id, long when, int modifiers, int code, char ch) src : 이벤트를 발생시킨 컴포넌트

id : 이벤트의 유형

modifiers : 이벤트 발생시 같이 사용된 수정자 키를 의미

code : 함수키와 같은 특수한 키를 의미

ch : 입력된 문자를 의미

메소드 char getKeyChar() 입력된 문자 값을 반환

char getKeyCode() 입력된 문자 값에 해당하는 정수값 반환

char getKeyText(int keyCode) keyCode를 문자열로(예: “HOME”)

KeyEvent

Page 12: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

23/62

MouseEvent

발생 상황 마우스의 동작에 따라 이벤트 발생

마우스 이벤트(MouseListener) : click, enter, exit 등

마우스 모션 이벤트(MouseMotionListener) : moves와 drag 등

이벤트의 유형을 구문하기 위한 상수 제공 MOUSE_CLICKED 마우스 클릭

MOUSE_DRAGGED 마우스 드래그

MOUSE_ENTERED 마우스가 컴포넌트 영역에 진입

MOUSE_EXITED 마우스가 컴포넌트 영역에서 나왔을 때

MOUSE_MOVED 마우스가 이동할 때

MOUSE_PRESSED 마우스가 눌려졌을 때

MOUSE_RELEASED 마우스가 띄어졌을 때

24/62

생성자 MouseEvent(Component src, int id, long when, int modifiers,

int x, int y, int clicks, boolean triggersPopup)

MouseEvent(Component src, int id, long when, int modifiers, int x, int y, int clicks, boolean triggersPopup, int button) src : 이벤트를 발생시킨 컴포넌트 id : 이벤트의 유형

modifiers : 이벤트가 발생하였을 때 같이 사용된 수정키를 의미

x, y : 컴포넌트에서 이벤트가 일어난 위치를 의미

clicks : 마우스가 눌러진 횟수

triggersPopup : 이 값이 true이면 이벤트가 팝업(popup) 메뉴에서 일어났음을 의미

button : 변경된 마우스 버튼을 표시, NOBUTTON, BUTTON1, BUTTON2 or BUTTON3

MouseEvent

Page 13: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

25/62

MouseEvent

메소드 int getX() 이벤트가 발생한 위치의 x값을 반환

int getY() 이벤트가 발생한 위치의 y값을 반환

Point getPoint() 이벤트가 발생한 위치를 Point 객체로 반환

Point 클래스는 java.awt 패키지에 제공되는 클래스로 이클래스의 객체는 이벤트가 발생한 위치의 x, y 값을 가짐

void translatePoint(int x, int y) 이벤트의 발생위치를 x, y 값으로변환

int getClickCount() 마우스가 눌러진 횟수를 반환

26/62

MouseWheelEvent

발생 상황 휠마우스를 사용하기 위한 이벤트

이벤트의 유형을 구문하기 위한 상수 제공 WHEEL_BLOCK_SCROLL page-up,down 등의 block scroll

WHEEL_UNIT_SCROLL arrow key를 이용한 unit scrool

Page 14: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

27/62

TextEvent

발생 상황 텍스트의 내용이 변했을 때 발생

생성자

TextEvent(Object source, int id) source : 이벤트를 발생시킨 객체를 의미

id : 이벤트의 유형을 지정하는 상수

28/62

WindowEvent 발생 상황

윈도우 상태 변화를 나타냄

윈도우가 열리거나, 닫히거나, 닫히는 중이거나, 활성화/비활성화되었거나, 아이콘화/정상화되었을 경우

이벤트의 유형을 구분하기위한 상수 제공 WINDOW_ACTIVATED 윈도우가 활성화 될 때

WINDOW_CLOSED 윈도우가 닫힐 때

WINDOW_CLOSING 사용자의 요청으로 윈도우가 닫힐 때

WINDOW_ICONIFIED 윈도우가 아이콘화 될 때

WINDOW_OPENED 윈도우가 생성될 때

메소드 Window getWindow() 이벤트를 발생시킨 Window 객체를 반환

Page 15: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

29/62

이벤트 객체가 포함하는 정보 이벤트 종류

이벤트 소스

이벤트가 발생한 화면 좌표

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

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

클릭된 마우스 버튼 번호

마우스의 클릭 횟수

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

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

이벤트 객체의 제공 정보

30/62

이벤트에 따라 조금씩 다른 정보 포함 ActionEvent 객체 : 액션 문자열

MouseEvent 객체 : 마우스의 위치 정보, 마우스 버튼, 함께 눌러진 키 정보 등

ItemEvent 객체 : 아이템의 체크 상태

이벤트 소스 알아 내기

object EventObject.getSource() 발생한 이벤트의 소스 컴포넌트를 리턴

Object 타입으로 리턴하므로 캐스팅하여 사용해야 함

모든 이벤트 객체에서 제공됨

이벤트 객체의 제공 정보

Page 16: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

31/62

주요 이벤트 객체의 메소드 예

Object getSource()

String getActionCommand() Object getItem()int getStateChange()

int getModifiers()

int getButton()int getClickCount()Point getPoint()int getX()int getY()

char getKeyChar()int getKeyCode()String getKeyText()

EventObject

ComponentEvent ItemEventActionEvent

AWTEvent

InputEvent

MouseEvent KeyEvent

32/62

이벤트의 처리 방법

청취자(Listener) 인터페이스 이용하는 방법 이벤트 처리를 위탁하는 일반적인 방법

어댑터(Adapter) 클래스를 이용하는 방법 필요한 메소드만 구현하여 처리 가능

Page 17: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

33/62

이벤트 청취자 : 이벤트를 처리하는 이벤트 처리기

이벤트 청취자는 인터페이스(interface) 이벤트가 발생하면 이미 약속된 메소드 호출

사용되는 청취자 인터페이스의 모든 추상 메소드 구현 필요

예) ActionListener 인터페이스

예) MouseListener 인터페이스

이벤트 청취자(Listener)

interface ActionListener { // 아래 메소드를 개발자가 구현해야 함public void actionPerformed(ActionEvent e); // Action 이벤트 발생시 호출

}

interface MouseListener { // 아래의 5개 메소드를 개발자가 구현해야 함public void mousePressed(MouseEvent e); // 마우스 버튼이 눌러지는 순간 호출public void mouseReleased(MouseEvent e); // 눌러진 마우스 버튼이 떼어지는 순간 호출public void mouseClicked(MouseEvent e); // 마우스가 클릭되는 순간 호출public void mouseEntered(MouseEvent e); // 마우스가 컴포넌트 위에 올라가는 순간 호출public void mouseExited(MouseEvent e); // 마우스가 컴포넌트 위에서 내려오는 순간 호출

}

34/62

이벤트 청취자(Listener) 이벤트 처리를 위해 청취자 인터페이스(Listener Interface)

를 사용

청취자 인터페이스를 사용한 이벤트 처리 순서

1) 이벤트 컴포넌트 및 처리할 이벤트의 종류를 결정한다

2) 이벤트에 적합한 이벤트 청취자 인터페이스를 구현한 이벤트 처리기를 작성

3) 이벤트 발생처와 이벤트 처리기를 연결

GUI 컴포넌트

청취자 청취자 청취자

이벤트 발생발생된 이벤트에 따라 해당 청취자에 이벤트 전달

컴포넌트에 등록된 청취자 들

Page 18: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

35/62

이벤트 청취자(Listener)

이벤트 청취자 등록 이벤트를 받아 처리하고자 하는 컴포넌트에 이벤트 청취자 연결

이벤트 청취자 등록시 사용되는 메소드 Component.addXXXListener(listener)

xxx : 이벤트 명

listener : 이벤트 청취자 객체

예) addMouseListener(), addActionListener(), addFocusListener() 등

이벤트 청취자가 등록된 컴포넌트에만 이벤트 처리 가능

36/62

이벤트 클래스 리스너 인터페이스 리스너 메소드 메소드가 호출되는 경우

ActionEvent ActionListener actionPerformed(ActionEvent) ActionEvent 가 발생하는 경우

ItemEvent ItemListener itemStateChanged(ItemEvent) ItemEvent 가 발생하는 경우

KeyEvent KeyListener keyPressed(KeyEvent) 키가 눌러질 때

keyReleased(KeyEvent) 눌러진 키가 떼어질 때

keyTyped(KeyEvent) 키가 입력될 때

MouseEvent MouseListener mousePressed(MouseEvent) 마우스 버튼이 눌러질 때

mouseReleased(MouseEvent) 눌러진 마우스 버튼이 떼어질 때

mouseClicked(MouseEvent) 마우스 클릭될 때

mouseEntered(MouseEvent) 마우스가 임의의 컴포넌트 위에 올라올 때

mouseExited(MouseEvent) 컴포넌트에 올라온 마우스가 컴포넌트를 벗어날 때

MouseMotionEvent MouseMotionListener mouseDragged(MouseEvent) 마우스를 임의의 컴포넌트 위에서 드래깅할 때

mouseMoved(MouseEvent) 마우스를 임의의 컴포넌트 위에서 움직일 때

FocusEvent FocusListener focusGained(FocusEvent) 컴포넌트가 포커스를 받을 때

focusLost(FocusEvent) 컴포넌트가 포커스를 잃을 때

이벤트 청취자(Listener)

Page 19: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

37/62

이벤트 클래스 리스너 인터페이스 리스너 메소드 메소드가 호출되는 경우

TextEvent TextListener textValueChanged(TextEvent) 텍스트가 변경될 떄

WindowEvent WindowListener windowOpened(WindowEvent) 윈도우가 생성되어 처음으로 보이게 될 때

windowClosing(WindowEvent) 사용자가 윈도우의 시스템 메뉴에서 윈도우 닫기를 시도할 때

windowIconfied(WindowEvent) 윈도우가 보통 크기에서 아이콘화될 때

windowDeiconfied(WindowEvent) 아이콘 상태의 윈도우가가 보통 상태로 복귀할 때

windowClosed(WindowEvent) 윈도우 닫기 절차에 의해 윈도우가 닫혀졌을 때

windowActivated(WindowEvent) 윈도우가 활성화 윈도우로 설정되어 활성화될 때

windowDeactivated(WindowEvent) 활성화 상태의 윈도우가 비활성화될 때

AdjustmentEvent AdjustmentListener adjustmentValueChanged(AdjustmentEvent) 스크롤바를 움직였을 때

ComponentEvent ComponentListener componentHidden(ComponentEvent) 컴포넌트가 보이지 않는 상태로 될 때

componentShown(ComponentEvent) 컴포넌트가 보이는 상태로 될 때

componentResized(ComponentEvent) 컴포넌트의 크기가 변경될 때

compnentMoved(ComponentEvent) 컴포넌트의 위치가 변경될 때

ContainerEvent ContainerListener componentAdded(ContainerEvent) 컴포넌트가 컨테이너에 추가될 때

componentRemoved(ContainerEvent) 컴포넌트가 컨테이너에서 삭제될 때

이벤트 청취자(Listener)

38/62

이벤트 청취자(Listener)

한 컴포넌트는 서로 다른 이벤트에 대한 청취자를 동시에 여러개 가질 수 있음 button.addActionListener(listener1); // ActionListener

button.addKeyListener(listener2); // KeyListener

button.addFocusListener(listener3); // FocusListener

한 컴포넌트는 한 이벤트에 대해 여러 개의 청취자를 동시에 가질 수 있음 button.addActionListener(new MyButtonListener1());

button.addActionListener(new MyButtonListener2());

button.addActionListener(new MyButtonListener3());

이때, 청취자는 등록된 반대 순으로 모두 실행됨

Page 20: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

39/62

이벤트 청취자(Listener)

서로 다른 여러 컴포넌트에서 발생된 이벤트를 하나의청취자를 통해 처리할 수 있음 comboBox.addActionListener(listener);

checkBox1.addActionListener(listener);

checkBox2.addActionListener(listener);

radioButton.addActionListener(listener);

40/62

버튼 응용 1 – Action Event

버튼을 마우스로 클릭 했을 때의 처리

ActionListener Interface

ActionListener Interface의 구현 필요 : 예)ClickListener 버튼 클릭 시 수행해야 할 일을 actionPerformed 메소드에 구현

public interface ActionListener { void actionPerformed(ActionEvent event);

}

public class ClickListener implements ActionListener {public void actionPerformed(ActionEvent event){

System.out.println("I was clicked.");}

}

Page 21: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

41/62

버튼 응용 1 – Action Event

청취자 클래스의 객체를 생성하고 버튼에 추가

결과 예:

ActionListener listener = new ClickListener(); button.addActionListener(listener);

42/62

버튼 응용 실습 1

강의 홈페이지의 button1 폴더 내의ButtonTester.java code를 이해하고 실행 결과를 확인하라.

필요 시 자바 홈페이지의 JButton 클래스 및 이의 슈퍼클래스의 설명을 참조하라.

Page 22: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

43/62

버튼 응용 2 – 투자 검사

버튼이 클릭될 때마다 이자가 추가되며 새로운 잔고가 화면에 표시

Jbutton 클래스의 객체 구성

JButton button = new JButton("Add Interest");

44/62

버튼 응용 2 – 투자 검사

은행 잔고를 보여주는 JLabel 객체 생성

컴포넌트들을 프레임에 추가

혹은

JLabel label = new JLabel("balance=" + account.getBalance());

JPanel panel = new JPanel();panel.add(button);panel.add(label);frame.add(panel);

frame.add(button,BorderLayout.WEST);frame.add(label,BorderLayout.EAST);

Page 23: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

45/62

버튼 응용 2 – 투자 검사

ActionListener Interface의 구현 버튼을 클릭했을 때 이자를 더하고 새로운 잔고를 출력

class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) {

double interest = account.getBalance() * INTEREST_RATE / 100; account.deposit(interest); label.setText("balance=" + account.getBalance());

} }

46/62

텍스트 입력 처리

텍스트 입력을 이용한 이자 정보 제공

JTextField : 한 줄의 문자열을 입출력

가급적 예상되는 문자수로 초기화 하는 것이 좋음

텍스트 필드의 용도를 알려주는 레이블 사용 권장

final int FIELD_WIDTH = 10; // 보여 주는 character 수final JTextField rateField = new JTextField(FIELD_WIDTH);

JLabel rateLabel = new JLabel("Interest Rate: ");

Page 24: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

47/62

텍스트 입력 처리

ActionListener Interface의 구현 getText 메소드를 이용하여 이자율을 읽어 옴

버튼을 클릭했을 때 이자를 더하고 새로운 잔고를 출력

class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) {

double rate = Double.parseDouble(rateField.getText()); double interest = account.getBalance() * rate / 100; account.deposit(interest); label.setText("balance=" + account.getBalance());

} }

48/62

텍스트 입력 실습

강의 홈페이지의 button2 폴더 내의InvestmentViewer1.java code를 이해하고 실행결과를 확인하라.

강의 홈페이지의 textfield 폴더 내의InvestmentViewer2.java code를 이해하고 실행결과를 확인하라)

Page 25: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

49/62

마우스 이벤트

MouseListener Interface의 구현을 통해 마우스 이벤트처리

public interface MouseListener{

void mousePressed(MouseEvent event); // Called when a mouse button has been pressed on a component void mouseReleased(MouseEvent event); // Called when a mouse button has been released on a component void mouseClicked(MouseEvent event); // Called when the mouse has been clicked on a component void mouseEntered(MouseEvent event); // Called when the mouse enters a component void mouseExited(MouseEvent event); // Called when the mouse exits a component

}

50/62

마우스 이벤트

mousePressed 마우스가 눌려질 때 호출

mouseReleased 마우스를 뗄 때 호출

mouseClicked 마우스를 움직이지 않고 재빨리 누르고 뗄 때 호출

mouseEntered 마우스가 컴포넌트에 진입될 때 호출

mouseExited 마우스가 컴포넌트에서 나올 때 호출

Page 26: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

51/62

마우스 이벤트

마우스 이벤트 사용 앞의 5개의 메소드를 모두 구현하는 청취자 클래스 구현

청취자 객체를 컴포넌트에 추가

public class MyMouseListener implements MouseListener{

// Implements five methods } MouseListener listener = new MyMouseListener(); component.addMouseListener(listener);

52/62

어댑터(Adapter) 클래스

청취자 인터페이스를 사용하여 이벤트를 처리하는 경우 인터페이스에 선언된 모든 메소드를 오버라이딩하여 구현하여야 한다(불필요한 메소드도 구현)

자바는 리스너 인터페이스의 기능을 추상 클래스인 아댑터클래스로 제공

ComponentListener ComponentAdapter

ContainerListener ContainerAdapter

FocusListener FocusAdapter

KeyListener KeyAdapter

MouseListener MouseAdapter

MouseMotionListener MouseMotionAdapter

WindowListener WindowAdapter

Page 27: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

53/62

어댑터(Adapter) 클래스

인터페이스가 아닌 클래스로 제공

장점 -필요한 메소드만 구현해서 사용하는 방법 제공

단점 - 다중 상속 불가능. 어댑터 클래스를 상속한 클래

스는 다른 클래스로부터 상속할 수 없음.

54/62

[실습1] 마우스 이벤트

강의 홈페이지의 mouse 폴더내의RectangleComponentViewer.java code를 이해하고 실행 결과를 확인하라.

구현이 불필요한 4가지 메소드의 구현 상태를 확인하라.

Page 28: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

55/62

[실습2] 마우스 어댑터

강의 홈페이지의 mouseAdapter 폴더 내의RectangleAdpaterViewer.java code를 실행하고테스트하라.

실행 결과를 확인하고 코드를 이해하라.

RectangleComponentViewer.java code 와의차이점을 파악하라.

56/62

[실습3] Action Listener

첨부된 ActionListener 폴더 내의 ClickCount는 버튼을 클릭하면 count가 증가하는 코드이다. 실행하여 동작을 확인하라.

코드를 보고 이벤트 청취자가 어떻게 구현되어 있는지 분석하라. 그 후 버튼에 이벤트 청취자를 연결하는 방법을 이해하라.

Page 29: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

57/62

[실습4] Action Listener

실습 3의 ClickCount.java 코드를 다음과 같이 수정하라. 버튼을 누르면 카운터 값이 증가하는 기존의 버튼은 유지

버튼을 누르면 카운터 값이 감소하는 새로운 버튼 추가.

아래의 구현 예를 참고하라.

58/62

[실습5] Mouse Listener

첨부된 MouseListener 폴더 내의 ButtonTester는 강의자료의 ActionEvent에 MouseEvent를 추가한 코드이다. 하나의 컴포넌트에 여러 개의 이벤트 청취자를 추가할 수 있는 것

을 확인하라.

ButtonTester를 실행해보고 마우스 동작에 따라 이벤트가처리됨을 확인하라. 그 후 MyMouseListener를 보고 실제로 어떤 메소드가 구현되어 있

는지 확인하라.

비어있는 메소드에 자유롭게 여러가지 기능을 넣고 테스트하라.

Page 30: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

59/62

[실습6] Motion Listener

첨부된 MotionListener 폴더 내의 StringViewFrame은Hello! 메시지가 마우스를 따라다니는 코드이다. 실행하여 동작을 확인하라.

새로운 메소드를 추가하여 마우스 드래그를 할 때에는 메시지의 색이 랜덤하게 바뀌도록 하라. R,G,B의 범위는 (int)0~255이다.

60/62

[실습7] Key Listener

첨부된 KeyListener 폴더 내의 InputViewFrame은 방향키입력을 받아 Input 메시지가 움직이는 코드이다. 실행하여 동작을 확인하라.

코드를 추가하여 방향키 이외의 입력을 받으면 메시지가해당 키 값으로 변하게 하라. getKeyChar() 를 이용하여 char 값을 얻을 경우 랩퍼 클래스를 이

용하여 String으로 변환하여야 한다.

event.getKeyText(keyCode)를 이용하여 String 값을 얻을 수 있다.

두 가지 경우를 모두 테스트 하고 차이점을 파악하라.

KeyEvent API 참고.

Page 31: JAVA 프로그래밍vip.sejong.ac.kr/dihan/java/lec09_10.pdfJAVA 프로그래밍 9. 이벤트처리 한동일 2/62 학습목표 To understand the Java event model To learn about the

61/62

[실습8] Draw Circle

첨부된 DrawCircle 폴더 내의 CircleDrawFrame은 마우스를 이용하여 원을 그리는 코드이다. 코드를 이해한 후 원을 그리는 동작이 어떻게 수행되는지 예측하라.

실행하여 동작을 확인하라.

CircleDrawFrame과 CircleDrawerComponent를 참조하여사각형을 그리는 RectangleDrawFrame과RectangleDrawerComponent를 작성하라. 시작점과 끝점의 위치관계에 유의하라.

드래그를 이용하여 사각형을 그림.

62/62

[실습9] Draw Line 실습 8의 원, 직사각형을 그리는 코드를 참고하여 직선을

그리는 코드를 그려라. 드래그에 의해서 그리지 않고 클릭에 의해서 라인 그리도록 코드를

작성하라.

첫번째 클릭에서 시작점 좌표 생성

두번째 클릭에서 끝점 좌표 생성 후 선모양 그림

위의 과정을 반복

위의 코드를 수정하여 클릭과 마우스 움직임에 반응하는직선을 그려라. 첫번째 클릭에서 시작점 좌표 생성

두번째 클릭 이전에 마우스 움직일 때 마우스를 따라가는 선모양생성

두번째 클릭에서 끝점 좌표 생성 후 선모양 그림

위의 과정을 반복