명품 JAVA Essential.

Slides:



Advertisements
Similar presentations
이벤트 처리  GUI 운영체제는 이벤트 드리븐으로 동작한다.  사용자와 상호 작용하려면 이벤트를 매끄럽게 처리하는 기술이 필요하다.  안드로이드에는 이벤트를 처리하는 다양한 방법이 있다.  팀 작업을 위해 모든 방법을 숙지해야 하며 자바의 고급 문법이 사용된다.
Advertisements

6 장 객체 - 지향 설계 ③. 목차 GUI 레이아웃  전화기 키 패드 전화기 키 패드 전화기 키 패드 모양의 GUI 를 만드는 Telephone.java, TelephonePanel.java 를 완성해 보자.  주석을 참고하여 TelephonePanel.java.
자바 5.0 프로그래밍.
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
12. GUI – 그래픽 이야기.
명품 JAVA Essential.
Chapter 16 : Struts 프레임워크 2. chapter 16 : Struts 프레임워크 2.
명품 JAVA Programming 제 11 장 스윙 컴포넌트와 이벤트 핸들링.
GUI 이벤트, 이벤트 리스너와 이벤트 소스 그림 그리기 내부 클래스
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
Chapter 10. AWT 이벤트.
Java 16장. 스윙 public class SumTest {
최윤정 Java 프로그래밍 클래스 상속 최윤정
명품 JAVA Programming 제 13 장 스레드와 멀티태스킹.
컴퓨터 프로그래밍 실습 #7 제 4 장 GUI 클래스 작성.
명품 JAVA Essential.
윤 홍 란 다이알로그(대화상자) 윤 홍 란
제 4 장 클래스 작성 Lab 4- 2.
9장 AWT(1).
Lesson 11. 이벤트.
Chapter 13 GUI 프로그래밍 01 GUI 화면 구성 02 GUI 이벤트 처리 03 GUI 메뉴와 툴바 예제 모음 요약
19장 스윙과 이벤트 처리 Section 1 스윙 컴포넌트 Section 2 이미지 아이콘과 라벨
이벤트 프로그래밍 안혜선.
Java Seminar Chapter 4.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
명품 JAVA Essential.
9장 AWT(1).
마우스(Mouse) 다루기 컴퓨터응용 및 실습 I.
1. C++ 시작하기.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
JAVA WINDOW PROGRAMMING
자바 5.0 프로그래밍.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Power Java 제14장 배치 관리자.
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
ASP.NET AJAX 비동기 게시판 작성 2007 컴퓨터공학실험( I )
그래픽 사용자 인터페이스와 사건처리.
7장 인터페이스와 추상 클래스.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
자바응용.
10장 tkinter로 GUI 만들기.
30강 JAVA 그래픽 JAVA GUI(Graphic User Interface)란? AWT 컴포넌트? Swing 컴포넌트?
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
15장 컬렉션 프레임워크 Section 1 컬렉션 프레임워크의 개요 Section 2 리스트 Section 3 셋
ASP.NET AJAX / AJAX Control Toolkit 응용 2008 컴퓨터공학실험( I )
Part 4 클래스 라이브러리 Chapter 10 : 다중 스레드 Chapter 11 : 패키지와 주요 클래스
자바 5.0 프로그래밍.
Mariadb JDBC PROGRAMMING2
CHAP 21. 전화, SMS, 주소록.
18강. 인터페이스 – II - 인터페이스와 다중상속 - 인터페이스를 통한 로봇 장남감 만들기 프로그래밍
[ 단원 04 ] 반복과 배열.
학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성. 학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성.
단축키 기능 1. 단축키 기능 설명 Alt + R 조회 S 저장 I 삽입 A 추가 D 삭제 P 출력 Q 닫기
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
JSP Programming with a Workbook
발표자 : 이지연 Programming Systems Lab.
9 브라우저 객체 모델.
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
Power Java 제14장 배치 관리자.
Power Java 제16장 이벤트 처리.
CHAP 5. 메뉴와 대화상자.
6 객체.
BoardGame 보드게임 따라가기.
Presentation transcript:

명품 JAVA Essential

학습 목표 자바의 이벤트 기반 GUI 프로그램 구조 이해 이벤트와 이벤트 객체 이벤트 리스너 작성 어댑터 클래스로 리스너 작성 Key 이벤트로 키 입력 받기 Mouse 이벤트로 마우스 동작 인식

이벤트 기반 프로그래밍 이벤트 기반 프로그래밍(Event Driven Programming) 이벤트 기반 응용 프로그램의 구조 이벤트의 발생에 의해 프로그램 흐름이 결정되는 방식 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너) 실행 실행될 코드는 이벤트의 발생에 의해 전적으로 결정 반대되는 개념 : 배치 실행(batch programming) 프로그램의 개발자가 프로그램의 흐름을 결정하는 방식 이벤트 종류 사용자의 입력 : 마우스 드래그, 마우스 클릭, 키보드 누름 등 센서로부터의 입력, 네트워크로부터 데이터 송수신 다른 응용프로그램이나 다른 스레드로부터의 메시지 이벤트 기반 응용 프로그램의 구조 각 이벤트마다 처리하는 리스너 코드 보유 GUI 응용프로그램은 이벤트 기반 프로그래밍으로 작성됨 GUI 라이브러리 종류 C++의 MFC, C# GUI, Visual Basic, X Window, Android 등 자바의 AWT와 Swing

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

자바 스윙 프로그램에서 이벤트 처리 과정 이벤트가 처리되는 과정 이벤트 발생 이벤트 객체 생성 예 :마우스의 움직임 혹은 키보드입력 이벤트 객체 생성 현재 발생한 이벤트에 대한 정보를 가진 객체 응용프로그램에 작성된 이벤트 리스너 찾기 이벤트 리스너 실행 리스너에 이벤트 객체 전달 리스너 코드 실행

자바의 이벤트 기반 스윙 응용프로그램의 구조와 이벤트 처리 과정

이벤트 객체 이벤트 객체 이벤트 객체가 포함하는 정보 이벤트 소스를 알아 내는 메소드 발생한 이벤트에 관한 정보를 가진 객체 이벤트 리스너에 전달됨 이벤트 리스너 코드가 발생한 이벤트에 대한 상황을 파악할 수 있게 함 이벤트 객체가 포함하는 정보 이벤트 종류와 이벤트 소스 이벤트가 발생한 화면 좌표 및 컴포넌트 내 좌표 이벤트가 발생한 버튼이나 메뉴 아이템의 문자열 클릭된 마우스 버튼 번호 및 마우스의 클릭 횟수 키의 코드 값과 문자 값 체크박스, 라디오버튼 등과 같은 컴포넌트에 이벤트가 발생하였다면 체크 상태 이벤트 소스를 알아 내는 메소드 Object getSource() 발생한 이벤트의 소스 컴포넌트 리턴 Object 타입으로 리턴하므로 캐스팅하여 사용 모든 이벤트 객체에 대해 적용

이벤트 객체와 이벤트 정보를 리턴하는 메소드 EventObject AWTEvent ActionEvent Object getSource() AWTEvent ActionEvent ComponentEvent ItemEvent String getActionCommand() Object getItem() int getStateChange() InputEvent int getModifiers() MouseEvent KeyEvent int getButton() int getClickCount() Point getPoint() int getX() int getY() char getKeyChar() int getKeyCode() String getKeyText()

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

리스너 인터페이스 이벤트 리스너 자바는 다양한 리스너 인터페이스 제공 사용자의 이벤트 리스너 작성 이벤트를 처리하는 자바 프로그램 코드, 클래스로 작성 자바는 다양한 리스너 인터페이스 제공 예) ActionListener 인터페이스 – 버튼 클릭 이벤트를 처리하기 위한 인터페이스 예) MouseListener 인터페이스 – 마우스 조작에 따른 이벤트를 처리하기 위한 인터페이스 사용자의 이벤트 리스너 작성 자바의 리스너 인터페이스 (interface)를 상속받아 구현 리스너 인터페이스의 모든 추상 메소드 구현 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); // 마우스가 컴포넌트 위에서 내려오는 순간 호출 }

자바에서 제공하는 이벤트 리스너 인터페이스

이벤트 리스너 작성 과정 사례 1. 이벤트와 이벤트 리스너 선택 버튼 클릭을 처리하고자 하는 경우 이벤트 : Action 이벤트, 이벤트 리스너 : ActionListener 2. 이벤트 리스너 클래스 작성 : ActionListener 인터페이스 구현 3. 이벤트 리스너 등록 이벤트를 받아 처리하고자 하는 컴포넌트에 이벤트 리스너 등록 component.addXXXListener(listener) xxx : 이벤트 명, listener : 이벤트 리스너 객체 class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { // 버튼이 클릭될 때 호출되는 메소드 JButton b = (JButton)e.getSource(); // 사용자가 클릭한 버튼 알아내기 if(b.getText().equals("Action")) // 버튼의 문자열이 "Action"인지 비교 b.setText("액션"); // JButton의 setText() 호출. 문자열변경 else b.setText("Action"); // JButton의 setText() 호출. 문자열변경 } MyActionListener listener = new MyActionListener(); // 리스너 인스턴스 생성 btn.addActionListener(listener); // 리스너 등록

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

예제 9-1 : 독립 클래스로 Action 이벤트 리스너 만들기 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class IndepClassListener extends JFrame { IndepClassListener() { setTitle("Action 이벤트 리스너 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout()); JButton btn = new JButton("Action"); btn.addActionListener(new MyActionListener()); c.add(btn); setSize(250, 120); setVisible(true); } public static void main(String [] args) { new IndepClassListener(); // 독립된 클래스로 이벤트 리스너를 작성한다. 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"); 버튼 클릭 Action 이벤트 리스너 등록 Action 이벤트 리스너 구현 독립된 클래스로 Action 이벤트 리스너 작성 이 클래스를 별도의 MyActionListener.java 파일로 작성하여도 됨

예제 9-2 : 내부 클래스로 Action 이벤트 리스너 만들기 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class IndepClassListener extends JFrame { IndepClassListener() { setTitle("Action 이벤트 리스너 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout()); JButton btn = new JButton("Action"); btn.addActionListener(new MyActionListener()); c.add(btn); setSize(250, 120); setVisible(true); } // 내부 클래스로 Action 리스너를 작성한다. private 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"); // InnerClassListener나 JFrame의 멤버 호출 가능 setTitle(b.getText()); // 프레임 타이틀에 버튼문자열 출력 public static void main(String [] args) { new IndepClassListener(); 버튼의 문자열을 타이틀에 출력 Action 이벤트 리스너를 내부 클래스로 작성 private으로 선언하여 외부에서 사용할 수 없게 함 리스너에서 InnerClassListener와 JFrame 멤버에 대한 접근 용이

익명 클래스로 이벤트 리스너 작성 익명 클래스(anonymous class) : 이름 없는 클래스 (클래스 선언 + 인스턴스 생성)을 한번에 달성 간단한 리스너의 경우 익명 클래스 사용 추천 메소드의 개수가 1, 2개인 리스너(ActionListener, ItemListener)에 대해 주로 사용 ActionListener를 구현하는 익명의 이벤트 리스너 작성 예 new 익명클래스의슈퍼클래스이름(생성자인자들) { ..................... 익명클래스의 멤버 구현 }; 익명클래스 작성 (클래스 선언과 인스턴스 생성을 동시에) class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { .... 메소드 구현 .... } 익명 클래스 b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { .... 메소드 구현 .... } }); b.addActionListener(new MyActionListener ()); (a) 이름을 가진 클래스를 작성하고 클래스 인스턴스를 생성하는 경우 (b) ActionListener를 상속받아 메소드를 작성하는 동시에 new로 인스턴스를 생성하는 경우

예제 9-3 : 익명 클래스로 Action 이벤트 리스너 만들기 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class IndepClassListener extends JFrame { IndepClassListener() { setTitle("Action 이벤트 리스너 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout()); JButton btn = new JButton("Action"); c.add(btn); setSize(250, 120); setVisible(true); } // 내부 클래스로 Action 리스너를 작성한다. private 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"); // InnerClassListener나 JFrame의 멤버를 호출 가능 setTitle(b.getText()); // 프레임 타이틀에 버튼문자열 출력 public static void main(String [] args) { new IndepClassListener(); 익명 클래스로 ActionListener 리스너 작성 btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JButton b = (JButton)e.getSource(); if(b.getText().equals("Action")) b.setText("액션"); else b.setText("Action"); // AnonymousClassListener나 // JFrame의 멤버를 호출 가능 setTitle(b.getText()); } });

예제 9-4 : 마우스 이벤트 리스너 작성 연습 - 마우스로 문자열 이동시키기 아래 실행 화면과 같이 프레임의 임의의 위치에 마우스 버튼을 누르면 마우스 포인터가 있는 위치에"Hello" 문자열을 출력하는 프로그램을 작성하라. 초기화면 마우스 다른 곳에 클릭한 경우 마우스 다른 곳에 클릭한 경우 마우스 버튼을 누르면 마우스가 있는 위치로 "Hello" 문자열을 이동시킨다. 이벤트와 리스너 : MouseEvent와 MouseListener 이벤트 소스 : 컨텐트팬 컨텐트팬의 배치관리자 : 배치관리자 삭제 구현할 리스너의 메소드 : mousePressed() "Hello" 문자열 : JLabel 컴포넌트 이용

예제 9-4의 정답 import java.awt.*; import java.awt.event.*; 마우스 버튼이 눌러진 위치를 알아내어 "Hello" 를 옮긴다. MouseListener의 5개 메소드를 모두 구현한다. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MouseListenerEx extends JFrame { JLabel la = new JLabel("Hello"); // "Hello" 출력용 레이블 MouseListenerEx() { setTitle("Mouse 이벤트 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.addMouseListener(new MyMouseListener()); c.setLayout(null); la.setSize(50, 20); // 레이블의 크기 50x20 설정 la.setLocation(30, 30); // 레이블의 위치 (30,30)으로 설정 c.add(la); setSize(200, 200); setVisible(true); } class MyMouseListener implements MouseListener { public void mousePressed(MouseEvent e) { int x = e.getX(); // 마우스의 클릭 좌표 x int y = e.getY(); // 마우스의 클릭 좌표 y la.setLocation(x, y); // (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();

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

MouseListener대신 MouseAdapter를 사용한 예 JLabel la; 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; contentPane.addMouseListener(new MyMouseAdapter()); ……………………….. class MyMouseAdapter extends MouseAdapter { public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); la.setLocation(x, y); } MouseAdapter를 이용한 경우 MouseListener를 이용한 경우

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

예제 9-5 : MouseAdapter로 마우스 리스너 작성 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MouseAdapterEx extends JFrame { JLabel la = new JLabel("Hello"); // "Hello" 출력용 레이블 MouseListenerEx() { setTitle("Mouse 이벤트 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.addMouseListener(new MyMouseAdapter()); c.setLayout(null); la.setSize(50, 20); // 레이블의 크기 50x20 설정 la.setLocation(30, 30); // 레이블의 위치 (30,30)으로 설정 c.add(la); setSize(200, 200); setVisible(true); } class MyMouseAdapter extends MouseAdapter { 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();

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

KeyListener 응용프로그램에서 KeyListener를 상속받아 키 리스너 구현 KeyListener의 3 개 메소드 컴포넌트에 키 이벤트 리스너 달기 키 리스너(KeyListener)  void keyPressed(KeyEvent e) { // 이벤트 처리 루틴 } void keyReleased(KeyEvent e) { void keyTyped(KeyEvent e) {  키를 누르는 순간 누른 키를 떼는 순간  누른 키를 떼는 순간, Unicode 키가 경우 실행되는 순서 :    component.addKeyListener(myKeyListener);

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

가상 키와 입력된 키 판별 KeyEvent 객체 입력된 키 정보를 가진 이벤트 객체 char KeyEvent.getKeyChar() 키의 유니코드 문자 값 리턴 Unicode 문자 키인 경우에만 의미 있음 입력된 키를 판별하기 위해 문자 값과 비교하면 됨 int KeyEvent.getKeyCode() 유니코드 키 포함 모든 키에 대한 정수형 키 코드 리턴 입력된 키를 판별하기 위해 가상키(Virtual Key) 값과 비교하여야 함 가상 키 값은 KeyEvent 클래스에 상수로 선언 public void keyPressed(KeyEvent e) { if(e.getKeyChar() == 'q') System.exit(0); } q 키가 누르면 프로그램 종료 public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_F5) System.exit(0); } F5 키를 누르면 프로그램 종료

가상 키(Virtual Key) 가상 키는 KeyEvent 클래스에 상수로 선언 가상 키의 일부 소개

예제 9-6 : KeyListener 활용 – 입력된 문자 키 판별 컨텐트팬에 <Enter> 키를 입력할 때마다 배경색을 랜덤하게 바꾸고, 'q' 키를 입력하면 프로그램을 종료시켜라. 'q' 키를 입력하면 프로그램 종료 컨텐트팬에 키 리스너를 달고, 포커스를 주어, 키 입력을 받도록 해야 한다. 색은 new Color(int r, int g, int b)로 생성한다. r(red), g(green), b(blue)는 색의 3요소로서 0~255 사이의 값이다.

예제 9-6 정답 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class KeyCharEx extends JFrame { JLabel la = new JLabel("<Enter>키로 배경색이 바뀝니다"); KeyCharEx() { super("KeyListener의 문자 키 입력 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout()); c.add(la); c.addKeyListener(new MyKeyListener()); setSize(250, 150); setVisible(true); c.requestFocus(); // 컨텐트팬에 포커스 설정 } class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { // 임의의 색을 만들기 위해 랜덤하게 r, g, b 성분 생성 int r = (int) (Math.random() * 256); // red 성분 int g = (int) (Math.random() * 256); // green 성분 int b = (int) (Math.random() * 256); // blue 성분 switch(e.getKeyChar()) { // 입력된 키 문자 case '\n': // <Enter> 키 입력 la.setText("r=" + r + ", g=" + g + ", b=" + b); getContentPane().setBackground( new Color(r, g, b)); break; case 'q': System.exit(0); } public static void main(String[] args) { new KeyCharEx();

예제 9-7 : KeyListener 활용 – 상(↑), 하(↓), 좌(←), 우(→) 키로 문자열 움직이기 상(↑), 하(↓), 좌(←), 우(→) 키를 입력하면, 다음 그림과 같이 "HELLO" 문자열이 10픽셀씩 이동하는 프로그램을 작성하라. (50,50) 초기 상태 상, 하, 좌, 우 키를 여러 번 입력하여 "HELLO"를 움직인 상태 상,하,좌,우 키를 움직이면 한 번에 10픽셀씩 "HELLO" 텍스트는 상,하,좌,우로 이동한다. 이 텍스트는 프레임의 영역을 벗어나서 움직일 수 있다.

예제 9-7 정답 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FlyingTextEx extends JFrame { JPanel contentPane = new JPanel(); JLabel la = new JLabel("HELLO"); FlyingTextEx() { super("상,하,좌,우 키를 이용하여 텍스트 움직이기"); 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(200, 200); setVisible(true); contentPane.requestFocus(); // 포커스 지정 } class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); // 입력된 키코드 switch(keyCode) { case KeyEvent.VK_UP: la.setLocation(la.getX(), la.getY() - 10); break; case KeyEvent.VK_DOWN: la.setLocation(la.getX(), la.getY() + 10); break; case KeyEvent.VK_LEFT: la.setLocation(la.getX() - 10, la.getY()); break; case KeyEvent.VK_RIGHT: la.setLocation(la.getX() + 10, la.getY()); break; } public static void main(String [] args) { new FlyingTextEx();

Mouse 이벤트와 MouseListener, MouseMotionListener mouseClicked() : 마우스가 눌러진 위치에서 그대로 떼어질 때 호출 mouseReleased() : 마우스가 눌러진 위치에서 그대로 떼어지든 아니든 항상 호출 mouseDragged(): 마우스가 드래그되는 동안 계속 여러번 호출 마우스가 눌러진 위치에서 떼어지는 경우 메소드 호출 순서 마우스가 드래그될 때 호출되는 메소드 호출 순서 mousePressed(), mouseReleased(), mouseClicked() 책과 다른 부분입니다. mousePressed(), mouseDragged(), mouseDragged(),..., mouseDragged(), mouseReleased(), mouseClicked()

마우스 리스너 달기와 MouseEvent 객체 활용 마우스 리스너는 컴포넌트에 다음과 같이 등록 컴포넌트가 마우스 무브(mouseMoved())나 마우스 드래깅(mouseDraggecd())을 함께 처리하고자 하면, MouseMotion 리스너 따로 등록 MouseEvent 객체 활용 마우스 포인터의 위치, 컴포넌트 내 상대 위치 int getX(), int getY() 마우스 클릭 횟수 int getClickCount() component.addMouseListener(myMouseListener); component.addMouseMotionListener(myMouseMotionListener); public void mousePressed(MouseEvent e) { int x = e.getX(); // 마우스가 눌러진 x 좌표 int y = e.getY(); // 마우스가 눌러진 y 좌표 } public void mouseClicked(MouseEvent e) { if(e.getClickCount() == 2) { ... // 더블클릭 처리 루틴 }

마우스 이벤트 처리 예 : MouseListener와 MouseMotionListener import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MouseEventAllEx extends JFrame { JLabel la = new JLabel(" Move Me"); MouseEventAllEx() { setTitle("MouseListener와 MouseMotionListener 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); MyMouseListener listener = new MyMouseListener(); c.addMouseListener(listener); c.addMouseMotionListener(listener); c.setLayout(null); la.setSize(80,20); la.setLocation(100,80); c.add(la); // 레이블 컴포넌트 삽입 setSize(300,200); setVisible(true); } class MyMouseListener implements MouseListener, MouseMotionListener { public void mousePressed(MouseEvent e) { la.setLocation(e.getX(), e.getY()); setTitle("mousePressed("+e.getX()+","+e.getY()+")"); } public void mouseReleased(MouseEvent e) { setTitle("mouseReleased("+e.getX()+","+e.getY()+")"); public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) { Component comp = (Component)e.getSource(); comp.setBackground(Color.CYAN); public void mouseExited(MouseEvent e) { comp.setBackground(Color.YELLOW); public void mouseDragged(MouseEvent e) { setTitle("mouseDragged("+e.getX()+","+e.getY()+")"); public void mouseMoved(MouseEvent e) { setTitle("mouseMoved ("+e.getX()+","+e.getY()+")"); public static void main(String [] args) { new MouseEventAllEx();

mouseExited()에 의해 배경색 변경 마우스 이벤트 처리 실행 마우스 좌표와 이벤트 처리 메소드 (10,10) (198,94) 초기화면 mouseEntered()에 의해 배경색 변경. 마우스 버튼이 눌러진 순간 눌러진 마우스 버튼이 떼어진 순간 (103,90) (88,96) 마우스가 컨텐트팬 위에 드래깅하는 동안 마우스가 컨텐트팬 위에 이동하는 동안 마우스가 컨텐트팬을 벗어나면 mouseExited()에 의해 배경색 변경