<4D F736F F F696E74202D205B4A415641C7C1B7CEB1D7B7A1B9D65D3130C0E5C0CCBAA5C6AEC3B3B8AE>

Similar documents
10장.key

PowerPoint 프레젠테이션

gnu-lee-oop-kor-lec10-1-chap10

Microsoft PowerPoint - 10장

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63138C0E520C0CCBAA5C6AE20C3B3B8AE28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 06-Chapter09-Event.ppt

public class FlowLayoutPractice extends JFrame { public FlowLayoutPractice() { super("flowlayout Practice"); this. Container contentpane = getcontentp

(Microsoft PowerPoint - LZVNQBAJWGTC.ppt [\310\243\310\257 \270\360\265\345])

오버라이딩 (Overriding)

Microsoft PowerPoint - 14주차 강의자료

슬라이드 1

Cluster management software

제8장 자바 GUI 프로그래밍 II

No Slide Title

운동시뮬레이션 강의 소개

<4D F736F F F696E74202D20C1A63139C0E520B9E8C4A120B0FCB8AEC0DA28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

11장.key

PowerPoint Presentation

Microsoft PowerPoint - lec09_12.ppt [호환 모드]

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63233C0E520B1D7B7A1C7C820C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - EEL2 Lecture10 -Swing and Event Handling.pptx

9장.key

Java Programing Environment

Microsoft PowerPoint - 04-UDP Programming.ppt

<4D F736F F F696E74202D20C1A63230C0E520BDBAC0AE20C4C4C6F7B3CDC6AE203128B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A63236C0E520BED6C7C3B8B428B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

PowerPoint Presentation

Microsoft PowerPoint - Java-03.pptx

강의자료

PowerPoint Presentation

Microsoft PowerPoint - java1-lecture10.ppt [호환 모드]

슬라이드 1

PowerPoint 프레젠테이션

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

PowerPoint Presentation

자바로

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint Presentation

자바GUI실전프로그래밍2_장대원.PDF

연습문제이론홀수정답

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

Microsoft Word - java18-1-final-answer.doc

PowerPoint 프레젠테이션

Microsoft PowerPoint - java2-lecture5.ppt [호환 모드]

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - Java7.pptx

PowerPoint Presentation

gnu-lee-oop-kor-lec06-3-chap7

10 이벤트 처리와 그래픽 프로그래밍.key

제11장 프로세스와 쓰레드

No Slide Title

PowerPoint 프레젠테이션

PowerPoint Presentation

(Microsoft PowerPoint - java1-lecture7.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

PowerPoint 프레젠테이션

어댑터뷰

(Microsoft PowerPoint - java2-lecture6.ppt [\310\243\310\257 \270\360\265\345])

쉽게 풀어쓴 C 프로그래밍

Design Issues

PowerPoint 프레젠테이션

Microsoft PowerPoint - [JAVA프로그래밍]9장GUI

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 05. 객체의 활용

Microsoft PowerPoint - 2강

Network Programming

05-class.key

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - java2-lecture6.ppt [호환 모드]

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

윈도우시스템프로그래밍

02 C h a p t e r Java

쉽게 풀어쓴 C 프로그래밊

PowerPoint 프레젠테이션

중간고사

JTable과 MVC(Model-View-Controller) 구조 - 모델-뷰-컨트롤러구조는데이터의저장과접근에대한제공은모델이담당하고, 화면표시는뷰, 이벤트의처리는컨트롤러가하도록각역할을구분한구조이다. 즉, 역할의분담을통하여상호간의영향을최소화하고각요소의독립성을보장하여독자

Cluster management software

슬라이드 1

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

ch09

PowerPoint Presentation

PowerPoint Template

Chap12

슬라이드 1

Microsoft PowerPoint - ÀÚ¹Ù08Àå-2.ppt

Spring Boot/JDBC JdbcTemplate/CRUD 예제

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

Microsoft PowerPoint - Lect04.pptx

Transcription:

명품 JAVA Programming 1 제 10 장자바의이벤트처리

GUI 응용프로그램 => 이벤트기반프로그래밍 2 이벤트기반프로그래밍 (Event Driven Programming) 이벤트의발생에의해프로그램흐름이결정되는방식 이벤트가발생하면이벤트를처리하는루틴 ( 이벤트리스너 ) 실행 프로그램내의어떤코드가언제실행될지아무도모름, 이벤트의발생에의해전적으로결정 반대되는개념 : 배치실행 (batch programming) 프로그램의개발자가프로그램의흐름을결정하는방식 이벤트종류 사용자의입력 : 마우스드래그, 마우스클릭, 키보드누름등센서의입력, 네트워크로부터데이터송수신다른응용프로그램이나다른스레드로부터의메시지 이벤트기반프로그램의구조 프로그램에서처리하고자하는이벤트의이벤트처리리스너들의집합

이벤트의실제예 3 마우스로메뉴선택 (Mouse Event, Action Event) 마우스로버튼클릭 (Mouse Event, Action Event) 마우스로윈도우크기조절 (Mouse Event, Container Event) 키보드입력 (Key Event) 키보드로메뉴선택 (Key Event, Action Event)

GUI 응용프로그램 => 이벤트기반프로그래밍 4 이벤트관련요소 이벤트소스 (Event Source) 이벤트를발생시킨 GUI Component 이벤트객체 이벤트발생시이벤트종류, 이벤트소스, 이벤트가발생한화면의좌표, 마우스버튼종류, 눌려진키의코드값등이벤트에대한여러속성값을가진객체 이벤트리스너 (Event Listener) 이벤트를처리하는코드로서컴포넌트에등록되어야작동가능함 이벤트분배스레드 이벤트기반프로그래밍의핵심요소로서무한루프를실행하는스레드 JVM으로부터이벤트발생을통지받으면이벤트소소와이벤트종류를결정하고이에따라이벤트객체생성, 이벤트리스너호출

5 자바의이벤트기반 GUI 응용프로그램구성

이벤트객체 6 이벤트객체란? 이벤트가발생할때, 발생한이벤트에관한정보를가진객체 이벤트를처리하는응용프로그램에다음패키지가포함되어야함 import java.awt.event.*; import javax.swing.event.*; 이벤트리스너에전달됨 이벤트리스너코드에서이벤트가발생한상황을파악할수있게함 이벤트객체의종류 java.util.eventobject EventObject java.awt.event.* java.awt.awtevent AWTEvent ListSelectionEvent javax.swing.event.listselectionevent ActionEvent AdjustmentEvent ComponentEvent ItemEvent TextEvent ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent MouseEvent KeyEvent

이벤트객체에포함된정보 7 이벤트객체가포함하는정보 이벤트종류이벤트소스이벤트가발생한화면좌표이벤트가발생한컴포넌트내좌표버튼이나메뉴아이템에이벤트가발생한경우버튼이나메뉴아이템의문자열클릭된마우스버튼번호마우스의클릭횟수키가눌러졌다면키의코드값과문자값체크박스, 라디오버튼등과같은컴포넌트에이벤트가발생하였다면체크상태 이벤트에따라조금씩다른정보포함 ActionEvent 객체 : 액션문자열 MouseEvent 객체 : 마우스의위치정보, 마우스버튼, 함께눌러진키정보등 ItemEvent 객체 : 아이템의체크상태 이벤트소스알아내기 Object EventObject.getSource() 발생한이벤트의소스컴포넌트의레퍼런스를리턴 Object 타입으로리턴하므로캐스팅하여사용 모든이벤트객체에대해적용

이벤트객체의메소드 8 EventObject Object getsource() AWTEvent ActionEvent String getactioncommand() ComponentEvent InputEvent int getmodifiers() ItemEvent Object getitem() int getstatechange() MouseEvent int getbutton() int getclickcount() Point getpoint() int getx() int gety() KeyEvent char getkeychar() int getkeycode() String getkeytext()

9 이벤트객체와이벤트소스

이벤트리스너 (Event Listener) 10 이벤트리스너란? 이벤트를처리하는코드클래스로작성 JDK 에서이벤트리스너작성을위한인터페이스 (interface) 제공 개발자가리스너인터페이스의추상메소드구현 이벤트가발생하면자바플랫폼은리스너인터페이스의추상메소드호출예 ) ActionListener 인터페이스 interface ActionListener { // 아래메소드를개발자가구현해야함 public void actionperformed(actionevent e); // Action 이벤트발생시호출됨 예 ) MouseListener 인터페이스 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); // 마우스가컴포넌트위에서내려오는순간호출

이벤트리스너등록 11 이벤트리스너등록 이벤트를받아처리하고자하는컴포넌트에이벤트리스너등록 이벤트리스너등록메소드 Component.addXXXListener(listener) xxx : 이벤트명 listener : 이벤트리스너객체 예 ) addmouselistener(), addactionlistener(), addfocuslistener() 등 이벤트리스너가등록된컴포넌트에만이벤트전달 이벤트리스너가등록된컴포넌트만이벤트리스너코드작동

리스너인터페이스와메소드 12

이벤트리스너작성예 13 import javax.swing.*; import java.awt.event.*; import java.awt.*; Mouse 이벤트리스너객체생성 Mouse 이벤트리스너등록 버튼의문자열변경 public class ListenerSample extends JFrame { ListenerSample () { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); ON CLOSE); JButton btn = new JButton("Action"); MyActionListener listener = new MyActionListener (); btn.addactionlistener(listener ); add(btn); setsize(300,150); setvisible(true); public static void main(string [] args) ){ new ListenerSample (); class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action); t("a ti 이벤트리스너등록 이벤트리스너구현

예제 10-1 : 버튼이 Mouse 이벤트를처리하는예제 14 초기상태 마우스가버튼에올라갈때 마우스가버튼에서내려올때 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class ListenerMouseEx extends JFrame { ListenerMouseEx() { settitle(" 버튼에 Mouse 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); ON CLOSE); JButton btn = new JButton("Mouse Event 테스트버튼 "); btn.setbackground(color.yellow); MyMouseListener listener = new MyMouseListener(); btn.addmouselistener(listener); add(btn); setsize(300,150); setvisible(true); public static void main(string [] args) { new ListenerMouseEx(); class MyMouseListener implements MouseListener { public void mouseentered(mouseevent e) { JButton btn = (JButton)e.getSource(); btn.setbackground(color.red); public void mouseexited(mouseevent e) { JButton btn = (JButton)e.getSource(); btn.setbackground(color.yellow); public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) {

15 Tip : 리스너등록메소드가 addxxxlistener인이유? 컴포넌트는다른이벤트에대한리스너를동시에가질수있다. JButton.addActionListener(); // Action 리스너 JButton.addKeyListener(); // Key 리스너 JButton.addFocusListener(); // Focus 리스너 Jbutton.addTextListener(); // Test 리스너 (X) 컴포넌트는한이벤트에대해여러개의리스너를동시에가질수있다. JButton.addActionListener(new MyButtonListener1()); JButton.addActionListener(new MyButtonListener2()); JButton.addActionListener(new MyButtonListener3()); 이때, 리스너는등록된반대순으로모두실행된다.

이벤트리스너작성방법 16 3 가지방법 독립클래스로작성 이벤트리스너를완전한클래스로작성 이벤트리스너를여러곳에서사용할때적합 내부클래스 (inner class) 로작성 클래스안에멤버처럼클래스작성 이벤트리스너를특정클래스에서만사용할때적합 익명클래스 (anonymous class) 로작성 클래스의이름없이간단히리스너작성 클래스조차만들필요없이리스너코드가간단한경우에적합

독립클래스로리스너작성 import javax.swing.*; import java.awt.event.*; import java.awt.*; 17 독립된클래스로 Action 이벤트리스너작성 이클래스를별도의 MyActionListener.java 파일로작성하여도됨 public class IndepClassListener extends JFrame { IndepClassListener() { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); ON CLOSE); setsize(300,150); setvisible(true); JButton btn = new JButton("Action"); MyActionListener listener = new MyActionListener(); btn.addactionlistener(listener); add(btn); public static void main(string [] args) { new IndepClassListener(); ste e class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b =(JButton)e (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action");

내부클래스로리스너작성 import javax.swing. *; import java.awt.event.*; import java.awt.*; Action 이벤트리스너를내부클래스로작성 private으로선언하여 InnerClassListener의외부에서사용할수없게함 리스너에서 InnerClassListener 의멤버에대한접근용이 18 public class InnerClassListener extends JFrame { InnerClassListener() { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); setsize(300,300); setvisible(true); JButton btn = new JButton("Action"); btn.addactionlistener(new MyActionListener()); add(btn); private class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" t(" 액션 "); else b.settext("action"); // InnerClassListener의멤버나 JFrame의멤버를호출할수있음 settitle(b.gettext()); // JFrame.setTitle() 호출 public static void main(string [] args) { new InnerClassListener();

익명클래스로이벤트리스너작성 19 익명클래스란? ( 클래스정의 + 인스턴스생성 ) 을한번에작성 new 익명클래스의수퍼클래스이름 ( 생성자의인자들 ) {... 클래스정의... ; ActionListener 를구현하는익명의이벤트리스너작성예 클래스선언 class MyActionListener implements ActionListener { public void actionperformed(actionevent e) {... 메소드구현... new MyActionListener (); 클래스인스턴스생성 new ActionListener() { public void actionperformed(actionevent e) {... 메소드구현... ; 익명클래스탄생 ( 클래스선언과인스턴스생성을동시에 )

익명클래스로이벤트리스너작성 익명클래스로다시작성된결과 btn.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) i b.settext(" 액션 "); else b.settext("action"); // AnonymousClassListener 의멤버나 // JFrame의멤버를호출할수있음 settitle(b.gettext()); ); import javax.swing.*; import java.awt.event.*; import java.awt.*; public class AnonymousClassListener extends JFrame { AnonymousClassListener() { settitle("action 이벤트리스너작성 "); setdefaultcloseoperation(jframe.exit_on_close); setlayout(new t( FlowLayout()); setsize(300,300); setvisible(true); JButton btn = new JButton("Action"); add(btn); btn.addactionlistener(new MyActionListener() ); private class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)egetSource(); (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action"); // InnerClassListener의멤버나 JFrame 멤버호출가능 settitle(b.gettext()); public static void main(string [] args) { new AnonymousClassListener (); 20 간단한리스너의경우익명클래스사용추천. 메소드의개수가 1, 2 개인리스너 (ActionListener, ItemListener) 에대해주로사용

예제 10-2 : 마우스로문자열이동시키기 21 프레임상의임의의위치에마우스버튼을누르면마우스포인트가있는위치로 "hello" 문자열을이동시키는스윙응용프로그램을작성하라 초기화면마우스다른곳에클릭한경우마우스다른곳에클릭한경우 마우스버튼을누르면마우스가있는위치로 "hello" 문자열을이동시킨다. 이벤트와리스너 : MouseEvent 와 MouseListener 이벤트소스 : JPanel 구현할리스너의메소드 : mousepressed() "hello" 문자열 : JLabel 컴포넌트이용 컨텐트팬 : JPanel 로교체, 배치관리자를 null 로설정

예제 10-2 의소스 22 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MouseListenerEx extends JFrame { JLabel la; 마우스버튼이눌러진위치를알아내어 la("hello" 문자열 ) 를그위치로옮긴다. class MyMouseListener implements MouseListener { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); MouseListenerEx() { public void mousereleased(mouseevent e) { settitle("mouse 이벤트예제 "); public void mouseclicked(mouseevent e) { setdefaultcloseoperation(jframe.exit_on_close); public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { JPanel contentpane = new JPanel(); setcontentpane(contentpane); setlayout(null); u public static void main(string [] args) ags){ contentpane.addmouselistener(new MyMouseListener()); new MouseListenerEx(); la = new JLabel("hello"); la.setsize(50, 20); la.setlocation(30, 30); contentpane.add(la); setsize(200,200); setvisible(true);

어댑터 (Adapter) 클래스 23 이벤트리스너구현에따른부담 리스너의추상메소드들을모두구현해야하는부담 마우스리스너에서마우스가눌러지는경우 (mousepressed()) 만처리하고자하는경우에도나머지 4 개의메소드를모두구현해야하는부담 어댑터클래스 JDK에서제공 리스너의모든메소드가단순리턴하도록구현해놓은클래스 MouseAdapter 예 class MouseAdapter implements MouseListener { 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) { 추상메소드가하나뿐인리스너는어댑터없음 ActionAdapter, ItemAdapter 클래스는존재하지않음

24 JDK 에서제공하는어댑터클래스

어댑터사용예 25 JLabel la; JPanel contentpane = new JPanel(); contentpane.addmouselistener(new MyMouseListener());.. class MyMouseListener implements MouseListener { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, (,y); public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { JLabel la; JPanel contentpane = new JPanel(); contentpane.addmouselistener(new MyMouseAdapter());.. class MyMouseAdapterM extends MouseAdapter { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); MouseAdapter 를이용한경우 MouseListener 를이용한경우

예제 10-3: MouseAdapter 사용하기 26 MouseAdapter 를이용하여예제 10-2 를수정하라. import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MouseAdapterEx extends JFrame { JPanel contentpane = new JPanel(); JLabel la; MouseAdapterEx() { settitle("mouse il 이벤트예제 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); setlayout(null); contentpane.addmouselistener(new MyMouseAdapter()); la = new JLabel("hello"); la.setsize(50, 20); la.setlocation(30, 30); contentpane.add(la); setsize(200,200); 200); setvisible(true); class MyMouseAdapter extends MouseApater { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); public static void main(string [] args) { new MouseAdapterEx(); class MyMouseListener implements MouseListener { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public static void main(string [] args) { new MouseListenerEx();

Key 이벤트와포커스 27 키입력시, 다음세경우에 Key 이벤트발생 키를누르는순간 누른키를떼는순간 누른키를떼는순간 (Unicode 키의경우에만 ) 키이벤트를받을수있는조건 모든컴포넌트가능하지만, 현재포커스 (focus) 를가진컴포넌트 포커스 (focus) 컴포넌트나응용프로그램이키이벤트를독점하는권한 컴포넌트에포커스설정방법 component requestfocus(); // component 가키이벤트를받을수 component.requestfocus(); // component 가키이벤트를받을수있게함

KeyListener 의메소드와키 28 KeyListener 의 3 개메소드 컴포넌트의키리스너 (KeyListener) 컴포넌트 void keypressed(keyevent e) { // 이벤트처리루틴 키를누르는순간누른키를떼는순간누른키를떼는순간, Unicode 키가입력된경우에만 void keyreleased(keyevent e) { // 이벤트처리루틴 void keytyped(keyevent e) { // 이벤트처리루틴 KeyListener 의메소드가실행되는순서 컴포넌트에키이벤트리스너등록 component.addkeylistener(mykeylistener);

유니코드 (Unicode) 29 유니코드키의특징 국제산업표준 전세계의문자를컴퓨터에서일관되게표현하기위한코드체계 문자들에대해서만코드값정의 A~Z, a~z, 0~9,!, @, & 등 문자키가아닌경우에는통일된키코드값없음 <Function> 키, <Home> 키, <Up> 키,<Delete> 키, <Control> 키, <Shift> 키, <Alt> 등 플랫폼에따라키코드값이다를수있음 유니코드키가아닌경우 keypressed(), keyreleased() 만호출됨 유니코드키가입력되는경우 keypressed(), keytyped(), keyreleased() 가순서대로호출

입력된키판별 30 KeyEvent 객체 키가입력되면입력된키정보를가진이벤트객체생성 : KeyEvent 객체 KeyEvent 객체가리스너에전달됨 KeyEvent 객체의메소드로입력된키판별 Unicode 키의문자값판별, char KeyEvent.getKeyChar() 눌러진키에해당하는문자값리턴 눌러진키가 Unicode 문자키인경우에만의미있음 Unicode 문자뿐아니라모든키판별, int KeyEvent.getKeyCode() 눌러진키에대한정수형키코드값리턴 Unicode 문자에관계없이, Function 키, Modifier(shift) 키, Control 키, Action 키등모든키에대해키코드값리턴 운영체제나하드웨어에따라키셋은서로다름 입력된키를판별하기위해가상키 (Virtual Key) 값과비교하여야함 가상키값은 KeyEvent 클래스의상수로정의됨 키이름문자열리턴 String KeyEvent.getKeyText(int keycode) static 메소드 keycode 의코드값에해당하는키이름문자열리턴 F1 키의경우 "F1", Shift 키의경우 "SHIFT" 등의문자열리턴

가상키 (Virtual Key) 31 가상키는 KeyEvent 클래스에상수로선언 가상키의일부분사례

32 KeyListener 의메소드와키

KeyEvent와 KeyListener의활용 : getkeycode(), getkeychar(), getkeytext() 사용 import javax.swing.*; import java.awt.event.*; awt import java.awt.*; public class KeyListenerEx extends JFrame { JPanel contentpane = new JPanel(); JLabel [] keymessage; 33 KeyListenerEx() { settitle("keylistener 예제 "); setdefaultcloseoperation(jframe.exit_on_close); ON CLOSE); setcontentpane(contentpane); contentpane.addkeylistener(new MyKeyListener()); keymessage = new JLabel [3]; keymessage[0] = new JLabel(" getkeycode() "); keymessage[1] = new JLabel(" getkeychar() "); keymessage[2] = new JLabel(" getkeytext() "); setsize(300,150); setvisible(true); contentpane.requestfocus(); class MyKeyListener extends KeyAdapter { public void keypressed(keyevent e) { int keycode = e.getkeycode(); char keychar = e.getkeychar(); keymessage[0].settext(integer.tostring(keycode)); keymessage[1].settext(character.tostring(keychar)); keymessage[2].settext(e.getkeytext(keycode)); public static void main(string [] args) { new KeyListenerEx(); for(int i=0; i<keymessage.length; i++) { contentpane.add(keymessage[i]); keymessage[i].setopaque(true); JComponent 컴포넌트에바탕색을지정하기위 keymessage[i].setbackground(color.cyan); 해서는사전에컴포넌트가불투명함을지정하여야 한다.

실행결과 34 초기화면 <Control> 키입력 w 키입력 <F1> 키입력 키 9 의키코드 키 9 의유니코드문자 키 9 의이름문자열 <Home> 키코드 <Home> 키에대응하는문자없음 <Home> 키의이름문자열

35 예제 10-4 : F1 키를입력받으면바탕을초록색으로, % 키를입력받으면바탕을노란색으로변경 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class KeyCodeEx extends JFrame { JPanel contentpane = new JPanel(); JLabel la = new JLabel(); class MyKeyListener extends KeyAdapter { public void keypressed(keyevent e) { la.settext(e.getkeytext(e.getkeycode())); if(e.getkeychar() == '%') contentpane.setbackground(color.yellow); else if(e.getkeycode() == KeyEvent.VK_F1) contentpane.setbackground(color.green); bli i id i i new KeyCodeEx(); KeyCodeEx() { settitle("key il Code 예제 : F1 키 : 초록색, % 키노란색 "); public static void main(string [] args) { setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); contentpane.addkeylistener(new MyKeyListener()); y contentpane.add(la); setsize(300,150); setvisible(true); contentpane.requestfocus(); % 키를판별하기위해 e.getkeychar() 이용 '%' 문자와비교 JPanel 이키입력을받을수있도록포커스를준다. F1 키를판별하기위해 e.getkeycode() 이용 KeyEvent.VK_F1 값과비교

예제 10-4 실행 36 %(Shift+5) 키가입력된경우로배경이노란색으로변경되었다. % 는 Shift 키 +5 키이므로최종적으로는 5 키에대한문자열이출력 키 5 를누른경우로서노란색배경으로변하지않는다.

37 예제 10-5 : 상, 하, 좌, 우키로 "HELLO" 문자열움직이기 상, 하, 좌, 우키를이용하여아래그림과같이 "HELLO" 문자열을화면에서움직이는응용프로그램을작성하라. "HELLO" 문자열은 JLabel 컴포넌트로생성하여컨텐트팬에부착하고상, 하, 좌, 우키를움직이면키방향으로한번에 10 픽셀씩움직인다. 이를위해컨텐트팬의배치관리자를삭제하여 야한다. 아래그림은초기 "HELLO" 문자열을 (50, 50) 위치에출력하고키를입력함에따라키방향으로문자열이움직이는화면이다. (50,50) 상하좌우키를움직이면한번에 10 픽셀씩 "HELLO" 텍스트는상하좌우로이동한다상, 하, 좌, 우키를움직이면한번에 10 픽셀씩 "HELLO" 텍스트는상, 하, 좌, 우로이동한다. 이텍스트는프레임의영역을벗어나서움직일수있다.

예제소스 : 상, 하, 좌, 우키로텍스트움직이기 38 import javax.swing.*; class MyKeyListener extends KeyAdapter { import java.awt.event.*; awt public void keypressed(keyevent e) { import java.awt.*; int keycode = e.getkeycode(); switch(keycode) { public class FlyingTextEx extends JFrame { case KeyEvent.VK_UP: JPanel contentpane = new JPanel(); la.setlocation(la.getx(), la.gety()-flying_unit); JLabel la = new JLabel("HELLO"); break; final int FLYING_UNIT = 10; case KeyEvent.VK_DOWN: la.setlocation(la.getx(), la.gety()+flying_unit); FlyingTextEx() { break; settitle(" 상, 하, 좌, 우키를이용하여텍스트움직이기 "); setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); setcontentpane(contentpane); contentpane.setlayout(null); contentpane.addkeylistener(new MyKeyListener()); la.setlocation(50,50); la.setsize(100,20); contentpane.add(la); setsize(300,300); setvisible(true); contentpane.requestfocus(); case KeyEvent.VK_LEFT: la.setlocation(la.getx()-flying_unit, la.gety()); break; case KeyEvent.VK_RIGHT: la.setlocation(la.getx()+flying_unit, la.gety()); break; public static void main(string [] args) { new FlyingTextEx();

39 MouseEvent와 MouseListener,MouseMotionListenerMouseMotionListener Mouse 이벤트 사용자의마우스조작에따라발생하는이벤트 마우스가클릭되어드래그되는동안호출되는메소드순서 mousepressed(), mousedragged(), mousereleased(), mouseclicked()

MouseEvent 로부터얻을수있는정보 40 마우스포인터의위치 int getx(), int gety(), Point getpoint() 입력된마우스버튼 short getbutton() 마우스클릭횟수 public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); public void mousepressed(mouseevent e) { if(e.getbutton() == MouseEvent.BUTTON1) System.out.println("Left Button Pressed"); int getclickcount() public void mouseclicked(mouseevent e) { 팝업메뉴클릭 boolean ispopuptrigger() if(e.getclickcount() g () == 2) ){ // 더블클릭을처리하는루틴

MouseListener 와 MouseMotionListener 사용 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MouseListenerAllEx extends JFrame { JPanel contentpane = new JPanel(); JLabel la; MouseListenerAllEx() { settitle("mouselistener와 MouseMOtionListener 예제 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); contentpane.addmouselistener( class MyMouseListener implements MouseListener, MouseMotionListener { public void mousepressed(mouseevent e) { la.settext("mousepressed t("m ("+e.getx()+","+e.gety()+")"); " " ty() ")") public void mousereleased(mouseevent e) { la.settext("mousereleased("+e.getx()+","+e.gety()+")"); public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { JPanel p = (JPanel)e.getSource(); p.setbackground(color.cyan); new MyMouseListener()); public void mouseexited(mouseevent e) { contentpane.addmousemotionlistener( JPanel p = (JPanel)e.getSource(); new MyMouseListener()); p.setbackground(color.yellow); la = new JLabel("No Mouse Event"); contentpane.add(la); add(la); public void mousedragged(mouseevent e) ){ la.settext("mousedragged ("+e.getx()+","+e.gety()+")"); setsize(300,200); setvisible(true); public void mousemoved(mouseevent e) { la.settext("mousemoved ("+e.getx()+","+e.gety()+")"); 41 public static void main(string [] args) { new MouseListenerAllEx();

42 실행 : MouseListener와 MouseMotionListener 사용 (20,92) (257,109) 초기화면 mouseentered() 에의해배경색변경. 눌러진마우스버튼이떼어진순간마우스버튼이눌러진순간 (162,89) (127,72) 마우스가패널위에이동하는동안 마우스가패널위에드래깅하는동안 마우스가패널바깥으로나가면 mouseexited() 에의해배경색변경

예제 10-6 : 더블클릭시컨텐트팬의배경색변경 더블클릭할때마다컨텐트팬의배경색을랜덤하게변경한다. import javax.swing.*; import java.awt.event.*; import java.awt.*; public class ClickAndDoubleClickEx extends JFrame { JPanel contentpane = new JPanel(); ClickAndDoubleClickEx() { settitle("click and DoubleClick 예제 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); contentpane.addmouselistener(new MyMouseListener()); setsize(300,200); setvisible(true); class MyMouseListener extends MouseAdapter { public void mouseclicked(mouseevent e) { if(e.getclickcount() == 2) { int r = (int)(math.random()*256); int g = (int)(math.random() random()*256); int b = (int)(math.random()*256); JPanel p = (JPanel)e.getSource(); p.setbackground(new Color(r,b,g)); 43 public static void main(string [] args) ){ new ClickAndDoubleClickEx();