39
1 1 17 장 장장장 장장 17.1 장장장장 ? 17.2 장장장 장장장 장장 17.3 장장장 장장 장장장장 17.4 Event 장장 17.5 장장장 장장 : 장장장 장장장장장 (Listner Interface) 17.6 장장장 장장 : 장장장 (Adapter) 장장장 17.7 장장 (Inner) 장장장

17장 이벤트 처리

Embed Size (px)

DESCRIPTION

17장 이벤트 처리. 17.1 이벤트란 ? 17.2 자바의 이벤트 모델 17.3 이벤트 관련 컴포넌트 17.4 Event 종류 17.5 이벤트 처리 : 리스너 인터페이스 ( Listner Interface) 17.6 이벤트 처리 : 아답터 ( Adapter) 클래스 17.7 내포 ( Inner) 클래스. 17.1 이벤트란?. 컴퓨터 사용자 상호작용 프로그램을 사용자가 직접 조작할 수 있는 응용 프로그램 요구 - PowerPoint PPT Presentation

Citation preview

11

17 장 이벤트 처리

17.1 이벤트란 ?17.2 자바의 이벤트 모델17.3 이벤트 관련 컴포넌트17.4 Event 종류17.5 이벤트 처리 : 리스너 인터페이스 (Listner Interface)17.6 이벤트 처리 : 아답터 (Adapter) 클래스17.7 내포 (Inner) 클래스

22

17.1 이벤트란 ?컴퓨터 사용자

상호작용프로그램을 사용자가 직접 조작할 수 있는 응용 프로그램

요구프로그램은 사용자와 상호작용을 위해 사용자의 요구 (

이벤트 ) 를 감지할 수 있어야 한다이벤트의 발생

사용자프로그램의 타이머 , 카운터의 값이 특정값을 넘었을 경우 등

이벤트 지향 (event-driven) 프로그램이벤트가 발생하기를 기다리는 무한 루프 (infinite loop) 프로그램

33

17.2 자바의 이벤트 모델

위임형 모델 (delegation event model)GUI 의 컴포넌트에서 이벤트가 발생되면 해당되는 리스너

(listener) 에게 이벤트 처리를 넘겨주는 방식이벤트 처리를 위한 컴포넌트에는 해당 리스너가 등록되어

있어야 하며 , 리스너에는 이벤트를 처리할 처리루틴이 포함되어 있어야 한다

GUI 컴포넌트

리스너 리스너 리스너

이벤트 발생발생된 이벤트에 따라 해당 리스너에 이벤트 전달

컴포넌트에 등록된 리스너들

44

17.3 이벤트 관련 컴포넌트

이벤트는 대부분 GUI 관련 컴포넌트에서 발생자바는 GUI 관련 컴포넌트들과 연관된 클래스를

java.awt 패키지로 제공 (18 장 )

55

17.3 이벤트 관련 컴포넌트

이벤트를 발생시키는 컴포넌트들의 클래스 계층 구조

ButtonCheckboxCanvasChoice PanelContainer ScrollPan Dialog FileDialog

Component Label WindowList FrameScrollbar TextArea

Object TextComponentTextField

MenuBarMenuComponent CheckboxMenuItem

MenuItemMenu PopupMenu

66

17.4 이벤트 종류

이벤트를 객체로 취급각 컴포넌트들은 다양한 이벤트를 발생시킨다자바는 다양한 이벤트와 관련된 이벤트 클래스들을

java.awt.event 패키지로 제공JVM 은 사용자의 조작에 따라 적합한 이벤트를 발생 ( 관련

클래스로부터 이벤트 객체 생성 ) 시킨다

77

17.4 이벤트 종류

Event 관련 클래스

ActionEventAdjustmentEvent

ContainerEventFocusEvent KeyEventInputEvent

Object MouseEvent

EventObject AWTEvent ComponentEventPaintEventWindowEvent

ItemEventTextEvent

88

17.4 이벤트 종류이벤트의 종류ActionEvent 버튼이 눌려지거나 , 리스트의 한 항목이 더블 클릭되어 선택되거나 ,

메뉴의 한 항목이 선택되었을 때 발생AdjustmentEvent 사용자가 스크롤바를 움직였을 때 발생ComponentEvent 컴포넌트가 감춰지거나 , 감춰진 상태에서 다시 나타날 때 , 컴포넌트를

이동하였을 때 , 크기를 조정하였을 때 발생ContainerEvent 컨테이너에 컴포넌트가 추가되거나 제거 되었을 때 발생 (18 장 참조 )FocusEvent 컴포넌트가 키보드 입력을 받아들일 수 있는 초점 (focus) 을 획득하거나 ,

초점을 잃었을 때 발생ItemEvent 체크박스나 리스트의 한 항목이 선택되었을 때 , 메뉴의 한 항목이

선택되거나 , 선택된 항목이 해제되었을 때 발생KeyEvent 키보드로부터 입력이 일어났을 때 발생MouseEvent마우스의 버튼이 눌려지고 띠어질 때 , 움직일 때 , 드래그 (drag) 할 때 ,

마우스의 초점이 컴포넌트 영역에 들어가거나 나올 때 발생TextEvent text area 나 text field 에서 값이 입력될 때 발생WindowEvent 윈도우가 활성화 (activate) 되거나 비활성화 될 때 , 아이콘화 될 때 ,

아이콘으로부터 윈도우로 복구될 때 , 윈도우가 open, close, quit 될 때

발생

99

17.4 이벤트 종류 - 컴포넌트와 이벤트의 관계 이벤트컴포넌트Button 0 0 0 0 0 0Canvas 0 0 0 0 0Checkbox 0 0 0 0 0 0Checkbox- 0MenuItemChoice 0 0 0 0 0 0Component 0 0 0 0 0Container 0 0 0 0 0 0Dialog 0 0 0 0 0 0

0 Frame 0 0 0 0 0 0

0 Label 0 0 0 0 0List 0 0 0 0MenuItem 0 0 0 0Panel 0 0 0 0 0 0Scrollbar 0 0 0 0 0 0TextArea 0 0 0 0 0 0TextField 0 0 0 0 0 0 0Window 0 0 0 0 0 0

0

Action adjust- compo- conta- focus item key mouse mouse- text windowevent ment nent iner event event event event motion event event event event event

1010

17.4 이벤트 종류 - (1) EventObject 클래스와 AWTEvent 클래스

EventObject 클래스생성자

EventObject(Object src)

메소드Object getSource() 이벤트를 발생시킨 객체를 반환String toString() 이벤트 이름을 문자열로 반환

AWTEvent 클래스 이벤트의 유형을 알아내기 위한 메소드 제공

int getID()

1111

17.4 이벤트 종류 - (2) ActionEvent 클래스

버튼이 눌려지거나 , 리스트의 항목이 선택되었을 때 , 메뉴의 한 항목이 선택되었을 때 발생이벤트가 발생하였을 때 같이 사용된 수정자 키를 구분하기 위해 4

개의 상수를 제공ALT_MASK 수정자 키로 ALT 키를 사용 CTRL_MASK 수정자 키로 CTRL 키를 사용META_MASK 수정자 키로 META 키를 사용SHIFT_MASK 수정자 키로 SHIFT 키를 사용

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

src : 이벤트를 발생한 객체 type : 이벤트의 타입

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

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

1212

17.4 이벤트 종류 - (2) ActionEvent 클래스

메소드

String getActionCommand() ActionEvent 를 발 생 시 킨 객 체 의 이름을

반 환 한 다 . 예 를 들 어 버 튼 이 눌려져서

이벤트가 발생하였다면 , 이 메소드는

버튼의 레이블을 문자열로 반환한다 .int getModifiers() 이 벤 트 발 생 시 같 이 사 용 된

수정자키를(ALT, CTRL, META, SHIFT)

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

1313

17.4 이벤트 종류 - (3) AdjustmentEvent 클래스

스크롤 바의 위치가 이동되면 발생 5 가지의 유형을 구분하기 위해 상수 제공

BLOCK_DECREMENT 스크롤 바의 값을 감소시키는 경우BLOCK_INCREMENT 스크롤 바의 값을 증가시키는 경우TRACK 스크롤 바를 드래그 (drag) 하는 경우UNIT_INCREMENT 스크롤 바의 값을 상향 버튼을 사용하여

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

감소시키는 경우생성자

AdjustmentEvent(Adjustable src, int id, int type, int data)src : 이벤트를 발생시킨 객체 id : 이벤트를 구분하기 위해 사용되는 상수 이 상수는 ADJUSTMENT_VALUE_CHANGED 로 표시된다 . type : 이벤트의 유형을 의미 data : 이벤트와 관련된 데이터 즉 스크롤 바의 이동 값

1414

17.4 이벤트 종류 - (3) AdjustmentEvent 클래스

메소드

Adjustable getAdjustable() 이벤트를 발생시킨 객체를 반환int getAdjustmentType() 이벤트의 유형을 반환int getValue() 스크롤의 이동 값을 반환

1515

17.4 이벤트 종류 - (4) ComponentEvent 클래스

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

COMPONENT_HIDDEN 컴포넌트가 감추어질 때COMPONENT_SHOWN 감추어진 컴포넌트가 다시 나타날 때COMPONENT_MOVED 컴포넌트가 이동하였을 때COMPONENT_RESIZED 컴포넌트의 크기가 변동되었을 때

생성자ComponentEvent(Component src, int type)

src : 이벤트를 생성된 컴포넌트 객체를 의미type : 이벤트의 타입을 의미

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

1616

17.4 이벤트 종류 - (5) ContainerEvent 클래스

컨테이너에 컴포넌트가 추가되거나 제거될 때 발생 2 가지 유형을 위한 상수

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

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

src : 이벤트를 발생시킨 객체를 의미type : 이벤트의 유형을 지정하는 상수comp : 컨테이너에 추가되거나 제거된 컴포넌트를 의미

메소드Container getContainer() 이벤트를 발생시킨 컨테이너를 반환Component getChild() 컨 테 이 너 에 추 가 되 거 나 제 거 된

컴포넌트를 반환

1717

17.4 이벤트 종류 - (6) FocusEvent 클래스

컴포넌트가 마우스의 초점을 획득하거나 잃었을 때 발생 2 가지 유형을 위한 상수

FOCUS_GAINED 컴포넌트가 마우스의 초점을 얻었을 때FOCUS_LOST 컴포넌트가 마우스의 초점을 잃었을 때

생성자FocusEvent(Component src, int type)

src : 이벤트를 발생시킨 컴포넌트 type : 이벤트의 유형

1818

17.4 이벤트 종류 - (7) InputEvent 클래스

Component 클래스로부터 상속된 클래스로서 추상 클래스이다

하위 클래스로 KeyEvent, MouseEvent 클래스가 제공이벤트의 유형을 구분하기 위한 상수 제공

ALT_MASK 수정자 키로 ALT 키를 사용 BUTTON1_MASK 첫 번째 마우스의 버튼 사용

( 보통 마우스는 3 개의 버튼 사용 )BUTTON2_MASK 두 번째 마우스 버튼 사용BUTTON3_MASK 세 번째 마우스 버튼 사용CTRL_MASK 수정자 키로 CTRL 키를 사용 META_MASK 수정자 키로 META 키를 사용 SHIFT_MASK 수정자 키로 SHIFT 키를 사용

1919

17.4 이벤트 종류 - (7) InputEvent 클래스

메소드boolean isAltDown() 수정자 키로 ALT 키가 사용되었으면 true, 아니면 false 를

반환

boolean isControlDown() 수정자 키로 CTRL 키가 사용되었으면 true, 아니면 false 를 반환

boolean isMetaDown() 수정자 키로 META 키가 사용되었으면 true, 아니면 false 를 반환

boolean isShiftDown() 수정자 키로 SHIFT 키가 사용되었으면 true, 아니면 false를 반환

int getModifiers() 이벤트 발생시 같이 사용된 수정자 키를 반환

2020

17.4 이벤트 종류 - (8) ItemEvent 클래스

체크박스나 리스트 항목이 선택되었을 때 , 메뉴의 한 항목이 선택되었을 때 , 선택된 항목이 해제될 때 발생이벤트의 유형을 구분하기 위한 2 개의 상수 제공

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

생성자ItemEvent(ItemSelectable src, int type, Object entry, int state)

src : 이벤트를 발생시킨 컴포넌트 type : 이벤트의 유형entry : 이벤트 발생시 전달하고자 하는 특수한 item 객체를 의미state : item 의 현재 상태를 의미

2121

17.4 이벤트 종류 - (8) ItemEvent 클래스

메소드

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

ItemSelectable 객체를 반환 리스트나 선택박스 등은 ItemSelectable

인터페이스를 이용하여 구현 int getStateChange() 이벤트의 발생으로 변환된 상태를 상수로

반환

2222

17.4 이벤트 종류 - (9) KeyEvent 클래스

키보드로부터 입력이 일어날 때 발생이벤트의 유형을 구분하기 위한 3 개의 상수 제공

KEY_PRESSED 키가 눌려졌을 때KEY_RELEASED 키가 띠어졌을 때KEY_TYPED 키에 의해 문자가 생성되었을 때

입력되는 문자를 구분하기 위한 상수VK_0 - VK_9

VK_A - VK_Z, VK_ENTER, VK_ESCAPE, VK_CANCEL 등

2323

17.4 이벤트 종류 - (9) KeyEvent 클래스

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

code)KeyEvent(Component src, int type, long when, int modifiers, int

code, char ch)src : 이벤트를 발생시킨 컴포넌트

type : 이벤트의 유형

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

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

ch : 입력된 문자를 의미

메소드

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

2424

17.4 이벤트 종류 - (10) MouseEvent 클래스

마우스의 동작에 따라 이벤트 발생이벤트의 유형을 구문하기 위한 상수 제공

MOUSE_CLICKED 마우스 클릭MOUSE_DRAGGED 마우스 드래그MOUSE_ENTERED마우스가 컴포넌트 영역에 진입MOUSE_EXITED 마우스가 컴포넌트 영역에서 나왔을 때MOUSE_MOVED 마우스가 이동할 때MOUSE_PRESSED 마우스가 눌려졌을 때MOUSE_RELEASED 마우스가 띄어졌을 때

2525

17.4 이벤트 종류 - (10) MouseEvent 클래스

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

x, int y, int clicks, boolean triggersPopup)

src : 이벤트를 발생시킨 컴포넌트 int : 이벤트의 유형

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

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

clicks : 마우스가 눌러진 횟수

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

의미한다

2626

17.4 이벤트 종류 - 10) 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() 마우스가 눌러진 횟수를 반환

2727

17.4 이벤트 종류 - (11) WindowEvent 클래스

윈도우가 활성화되거나 , 아이콘화 될 때 , 닫혀질 때 발생이벤트의 유형을 구분하기위한 상수 제공

WINDOW_ACTIVATED 윈도우가 활성화 될 때WINDOW_CLOSED 윈도우가 닫힐 때WINDOW_CLOSING 사용자의 요청으로 윈도우가 닫힐 때WINDOW_ICONIFIED 윈도우가 아이콘화 될 때WINDOW_OPENED 윈도우가 생성될 때

생성자WindowEvent(Window src, int type)

src : 이벤트를 발생시킨 Window 객체 type : 이벤트의 유형을 의미

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

2828

17.5 이벤트 처리 - 리스너 인터페이스

이벤트 처리를 위해 리스너 인터페이스 (Listner Interface) 를 사용리스너 인터페이스를 사용한 이벤트 처리 순서

1) 처리할 이벤트의 종류를 결정한다2) 이벤트에 적합한 이벤트 리스너 인터페이스를 사용하여 클래스를

작성3) 이벤트를 받아들일 각 컴포넌트에 리스너를 등록4) 리스너 인터페이스에 선언된 메소드를 오버라이딩하여 이벤트 처리

루틴 작성 java.awt.event 패키지에 이벤트와 관련된 이벤트 리스너 인터페이스

제공

2929

17.5 이벤트 처리 - 리스너 인터페이스이벤트 클래스와 인터페이스 , 인터페이스 선언 메소드

이벤트 클래스 리스너 인터페이스 리스너 인터페이스 메소드ActionEvent ActionListener actionPerform(ActionEvent)AdjuntmentEvent AdjustmentListener

adjustmentValueChanged(AdjustmentEvent)ComponentEvent ComponentListener

componentHidden(ComponentEvent)componentMoved(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)

ContainerEvent ContainerListenercomponentAdded(ContainerEvent)

componentRemoved(ContainerEvent)FocusEvent FocusListerner focusGained(FocusEvent)

focusLost(FocusEvent)ItemEvent ItemListener itemStateChanged(ItemEvent)KeyEvent KeyListener keyPressed(KeyEvent)

keyReleased(KeyEvent)keyTyped(KeyEvent)

3030

17.5 이벤트 처리 - 리스너 인터페이스이벤트 클래스와 인터페이스 , 인터페이스 선언 메소드MouseEvent MouseListener mouseClicked(MouseEvent)

mouseEntered(MouseEvent)mouseExited(MouseEvent)mousePressed(MouseEvent)mouseReleased(MouseEvent)

MouseMotionEvent MouseMotionListener mouseDragged(MouseEvent)mouseMoved(MouseEvent)

TextEvent TextListener textValueChanged(TextEvent)WindowEvent WindowListener windowActivated(WindowEvent)

windowClosed(WindowEvent)windowClosing(WindowEvent)

windowDeactivated(WindowEvent)

windowDeiconified(WindowEvent)windowIconified(WindowEvent)windowOpened(WindowEvent)

3131

17.5 이벤트 처리 - 리스너 인터페이스

이벤트를 받아들일 컴포넌트에 이벤트 리스너 등록 및 해제 메소드의 형태

void addTypeListener(TypeListener el)void removeTypeListener(TypeListener el)

Type : 이벤트의 이름

el : 이벤트 리스너를 의미

3232

17.5 이벤트 처리 - 리스너 인터페이스 이벤트 리스너를 등록하고 해제하는 메소드는 Component 클래스에서

제공

public synchronized void addComponentListener(ComponentListener listener)public synchronized void addFocusListener(FocusListener listener)public synchronized void addKeyListener(KeyListener listener)public synchronized void addMouseListener(MouseListener listener)public synchronized void addMouseMotionListener(MouseMotionListener

listener)

public synchronized void removeComponentListener(ComponentListener listener)

public synchronized void removeFocusListener(FocusListener listener)public synchronized void removeKeyListener(KeyListener listener)public synchronized void removeMouseListener(MouseListener listener)public synchronized void removeMouseMotionListener(MouseMotionListener

listener)

3333

17.5 이벤트 처리 - 리스너 인터페이스

예제

MouseEventDemo1.java

3434

17.5 이벤트 처리 - 리스너 인터페이스

예제

MouseEventDemo2.java

3535

17.6 이벤트 처리 - 아답터 (Adapter) 클래스

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

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

ComponentListener ComponentAdapterContainerListener ContainerAdapterFocusListener FocusAdapterKeyListener KeyAdapterMouseListener MouseAdapterMouseMotionListener MouseMotionAdapterWindowListener WindowAdapter

3636

17.6 이벤트 처리 - 아답터 (Adapter) 클래스

예제

MouseAdapterDemo2.java

3737

17.7 내포 (inner) 클래스

클래스가 다른 클래스 또는 표현식 내부에 포함되는 것을 의미

내포된 클래스에서는 자신을 포함하고 있는 클래스의 모든 것을 사용할 수 있다 ( 예제 참조 )

3838

17.7 내포 (inner) 클래스

예제 : MouseInnerDemo2.java 프로그램은 이벤트를 받아들일 애플릿 클래스의 내포된 클래스로서 아답터 클래스를 사용하는 예이다 . 내 포 된 클 래 스 를 이 용 하 면 MouseAdapterDemo2.java 프로그램처럼 아답터 클래스의 생성자를 이용하여 객체의 참조를 넘겨받을 필요가 없다 . 내포된 클래스에서는 내포하고 있는 클래스의 메소드를 별도의 참조 없이 바로 사용할 수 있다 .

MouseInnerDemo2.java

3939

17.7 내포 (inner) 클래스

예제 : 더 간편한 방법으로 class 예약어를 사용하지 않고 , 리스너 등록시 매개변수로 아답터를 바로 등록하는 방법이다 . 이러한 방법은 생성된 아답터 클래스가 한 곳에서만 사용될 때 유용하다 .

MouseInnerDemo3.java