8장 상속 ②.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

6 장 객체 - 지향 설계 ③. 목차 GUI 레이아웃  전화기 키 패드 전화기 키 패드 전화기 키 패드 모양의 GUI 를 만드는 Telephone.java, TelephonePanel.java 를 완성해 보자.  주석을 참고하여 TelephonePanel.java.
Timer Department of Digital Contents Sang Il Park.
12. GUI – 그래픽 이야기.
명품 JAVA Essential.
어서와 Java는 처음이지! 제20장 실전프로젝트 #2.
Ch.22 Command Pattern 장 덕 성 계명대학교 컴퓨터공학과 정보공학실험실
GUI 이벤트, 이벤트 리스너와 이벤트 소스 그림 그리기 내부 클래스
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
최윤정 Java 프로그래밍 클래스 상속 최윤정
7장 배열 ③.
컴퓨터 프로그래밍 실습 #7 제 4 장 GUI 클래스 작성.
GUI 환경에서 작동하는 프로그램에 대하여 윈도우 프로그램의 작성 방법 그래픽과 이미지 디스플레이 방법 오디오 파일 재생 방법
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
6장 객체-지향 설계 ①.
10장 예외 Lab 10-1.
제 4 장 클래스 작성 Lab 4- 2.
Lesson 11. 이벤트.
제2장 데이터 및 수식.
8장 상속 ①.
7장 배열 ②.
Lesson 5. 레퍼런스 데이터형.
프로그래밍 개론 Ⅰ 제 3장. 클래스와 객체의 사용 ②.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
9장 다형성 Lab 9-2.
10장 예외 Lab 10-2.
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
5장 조건과 반복 ③.
명품 JAVA Programming 제 15 장 애플릿과 멀티미디어.
프로세싱 게임 메이킹 자바실험실 JavaLab.org 이동준.
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
그래픽 사용자 인터페이스와 사건처리.
Java 6장. 클래스 : 속성 public class SumTest {
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
컴퓨터 프로그래밍 : 실습3 2장 데이터와 식.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
13. 연산자 오버로딩.
Method & library.
자바응용.
CHAP 13. 방명록 만들기 실습.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
3D 프린팅 프로그래밍 01 – 기본 명령어 강사: 김영준 목원대학교 겸임교수.
Moving Control in Web using Ajax Toolkit
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
웹서버 기능으로 데이터 읽기 및 제어하기 WiFi 시리얼 보드 활용가이드 김영준
JA A V W. 06.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
11. 어댑터뷰 제목. 11. 어댑터뷰 제목 리스트뷰와 그리드뷰 활용법을 배운다. 갤러리와 스피너의 사용법을 익힌다.
제 4 장 클래스 작성 Lab 4- 2.
Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects)
윤 홍 란 4 장 클래스 작성 윤 홍 란
안드로이드 앱 개발과정 Step1. 기초과정 강사 : 정 훈 희.
Chapter 4 클래스 작성.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
프로그래밍 개론 Ⅰ-실습 2장 데이터와 식①.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
5장 조건과 반복 ③.
타이머를 시작하려면 슬라이드 쇼 메뉴에서 쇼 보기를 클릭하십시오.
BoardGame 보드게임 따라가기.
Presentation transcript:

8장 상속 ②

목차 어댑터 클래스 화면에 점 찍기 애니메이션 움직이는 웃는 얼굴 카운트 다운

화면에 점 찍기 다음의 프로그램은 클릭한 곳에 점을 찍고, 그 개수를 세어준다. 이를 아래와 같이 수정해 보자. DotsListener가 MouseListener를 구현하는 대신, MouseAdapter를 상속 받도록 수정해 보자. 이렇게 함으로써 필요 없어지는 코드들을 삭제한다. 잘 작동하는지 테스트해 보자. DotsListener 클래스를 없애고, DotsPanel 자신을 리스너로 만들어 보자. DotsPanel이 MouseListener를 구현하도록 수정한다. DotsListener 클래스를 삭제하고, 그 안의 메소드들을 DotsPanel로 옮긴다. (Adapter로 만들면서 삭제했던 메소드들을 다시 만들어야 할 것이다.) 패널에 리스너를 등록하는 addMouseListener()메소드의 인자로 this를 넘긴다.

화면에 점 찍기 – Dots.java //******************************************************************** // Dots.java // // 마우스 이벤트를 실습한다. import javax.swing.JFrame; public class Dots { //----------------------------------------------------------------- // 애플리케이션 프레임을 생성하고 디스플레이한다. public static void main (String[] args) JFrame frame = new JFrame ("Dots"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add (new DotsPanel()); frame.pack(); frame.setVisible(true); }

화면에 점 찍기 – DotsPanel.java //******************************************************************** // DotsPanel.java // Dots 프로그램을 위한 primary 패널을 표현한다. import java.util.ArrayList; import javax.swing.JPanel; import java.awt.*; import java.awt.event.*; public class DotsPanel extends JPanel { private final int SIZE = 6; // 각 점의 반지름 private ArrayList<Point> pointList; //----------------------------------------------------------------- // 구성자 - 마우스 이벤트를 위한 리스너를 이 패널에 설정한다. public DotsPanel() pointList = new ArrayList<Point>(); addMouseListener (new DotsListener()); setBackground (Color.black); setPreferredSize (new Dimension(300, 200)); }

화면에 점 찍기 – DotsPanel.java //----------------------------------------------------------------- // 목록에 저장된 모든 점들을 그린다. public void paintComponent (Graphics page) { super.paintComponent(page); page.setColor (Color.green); for (Point spot : pointList) page.fillOval (spot.x-SIZE, spot.y-SIZE, SIZE*2, SIZE*2); page.drawString ("Count: " + pointList.size(), 5, 15); } //***************************************************************** // 마우스 이벤트 리스너를 표현한다. private class DotsListener implements MouseListener //-------------------------------------------------------------- // 마우스가 눌릴 때마다, 위치 목록에 현재의 위치를 추가하고, // 패널을 다시 그린다. public void mousePressed (MouseEvent event) pointList.add(event.getPoint()); repaint();

화면에 점 찍기 – DotsPanel.java //--------------------------------------------------- // 사용되지 않는 이벤트 메소드들의 빈 정의부를 제공한다. public void mouseClicked (MouseEvent event) {} public void mouseReleased (MouseEvent event) {} public void mouseEntered (MouseEvent event) {} public void mouseExited (MouseEvent event) {} }

움직이는 웃는 얼굴 다음의 프로그램은 윈도우 경계에서 튀는 것처럼 보이는 웃는 얼굴의 이미지를 표시한다. 이를 다음과 같이 수정해 보자. 튀는 속도를 조절해 보자. DELAY를 100으로 조절 후, 테스트 해 보자. DELAY를 다시 원래대로(20) 바꾸고, moveX와 moveY를 15로 바꾼 후, 테스트 해 보자. DELAY, moveX, moveY를 여러 가지 값으로 바꾸어 테스트 해 보자. 이미지를 하나 더 추가해 보자. 이미지를 저장하기 위한 변수를 만들고 이미지를 저장한다. 첫 번째 것과 같은 이미지를 사용해도 상관없다. 두 번째 이미지를 위한 변수 x2(0),y2(40), moveX2(5), moveY2(8)를 추가한다. 두 번째 이미지도 튀기는 것처럼 보이게 화면에 그리도록 actionPerformed() 메소드와 paintComponent() 메소드에 필요한 코드를 삽입한다.

움직이는 웃는 얼굴 – Rebound.java //******************************************************************** // Rebound.java // // 애니메이션과 Timer 클래스의 사용을 실습한다. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Rebound { //----------------------------------------------------------------- // 프로그램의 메인 프레임을 디스플레이한다. public static void main (String[] args) JFrame frame = new JFrame ("Rebound"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new ReboundPanel()); frame.pack(); frame.setVisible(true); }

움직이는 웃는 얼굴 – ReboundPanel.java //******************************************************************** // ReboundPanel.java // Rebound 프로그램을 위한 primary 패널을 표현한다. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ReboundPanel extends Jpanel { private final int WIDTH = 300, HEIGHT = 100; private final int DELAY = 20, IMAGE_SIZE = 35; private ImageIcon image; private Timer timer; private int x, y, moveX, moveY; //----------------------------------------------------------------- // 애니메이션을 위한 타이머 설정 등 패널을 설정한다. public ReboundPanel() { timer = new Timer(DELAY, new ReboundListener()); image = new ImageIcon ("happyFace.gif"); x = 0; y = 40; moveX = moveY = 3; setPreferredSize (new Dimension(WIDTH, HEIGHT)); setBackground (Color.black); timer.start(); }

움직이는 웃는 얼굴 – ReboundPanel.java //----------------------------------------------------------------- // 현재의 위치에 이미지를 그린다. public void paintComponent (Graphics page) { super.paintComponent (page); image.paintIcon (this, page, x, y); } //***************************************************************** // 타이머를 위한 액션 리스너를 표현한다. private class ReboundListener implements ActionListener { //-------------------------------------------------------------- // 타이머가 액션 이벤트를 발생시킬 때마다 // 이미지의 위치와 움직일 수 있는 방향을 업데이트 한다. public void actionPerformed (ActionEvent event) { x += moveX; y += moveY; if (x <= 0 || x >= WIDTH-IMAGE_SIZE) moveX = moveX * -1; if (y <= 0 || y >= HEIGHT-IMAGE_SIZE) moveY = moveY * -1; repaint();

카운트 다운 다음의 프로그램은 10부터 0까지 카운트 다운하는 디지털 시계를 보여준다. 아래의 지시사항에 따라 이를 완성해 보자. ActionListener를 구현한 CountListener를 추가하고, actionPerformed()메소드에 아래의 내용을 추가한다. DigitalDisplay클래스의 decrement()메소드를 이용하여 시계의 값을 감소시킨다. 시계의 값이 음수가 되면 시계를 멈추게 하고, 그렇지 않은 경우에는 패널을 새로 그린다.(repaint()호출) 생성자에서 타이머를 설정한다. 잘 동작하는지 확인해 보자.

카운트 다운 이제, 마우스 클릭에 시계가 반응하도록 수정해 보자. 시계가 작동되고 있는 상태에서 클릭하면 시계를 멈추고, 시계가 멈춰있는 상태에서 클릭하면 시계를 다시 10부터 동작하게 한다. MouseListener를 구현한 내부클래스를 작성한다. mouseClicked()메소드를 아래와 같이 작성한다. 시계가 동작하고 있다면, 시계를 멈춘다. 시계가 멈춰져 있는 상태라면, 시계의 값을 10으로 세팅하고 타이머를 다시 시작시킨 후, 화면을 다시 그린다. CountDownPanel클래스의 생성자를 아래와 같이 수정한다. Japplet 타입의 두 번째 매개변수를 추가한다. 이렇게 매개변수로 받아들인 applet에 마우스리스너를 설정한다. CountDown.java에서 CountDownPanel 생성 시, this를 두번재 매개변수로 보내도록 수정한다.

카운트 다운 – DigitalDisplay.java // *************************************************** // DigitalDisplay.java // // 하나의 숫자를 간단한 직사각형 모양으로 그린다. import java.awt.*; public class DigitalDisplay { private int displayVal; // 화면에 보여질 값 private int x, y; // 위치 private int width, height; // 크기 private Font displayFont; // 숫자의 크기 // --------------------------------------------------------- // 주어진 값으로 DigitalDisplay 객체의 값을 구성하고, // 글씨는 New Century Schoolbook체로, 두껍게, 크기 40으로 한다. public DigitalDisplay(int start, int x, int y, int w, int h) this.x = x; this.y = y; width = w; height = h; displayVal = start; displayFont = new Font ("New Century Schoolbook", Font.BOLD, 40); }

카운트 다운 – DigitalDisplay.java // ---------------------------- // 화면에 출력되는 값을 감소시킨다. public void decrement() { displayVal--; } // 화면에 출력되는 값을 증가시킨다. public void increment() { displayVal++; //화면에 출력되는 값을 반환한다. public int getVal() { return displayVal; // ------------------------------------------------------ // 화면에 출력되는 값을 매개변수에 주어진 값으로 설정한다. public void reset (int val) { displayVal = val;

카운트 다운 – DigitalDisplay.java // ---------------- // 화면을 그린다. public void draw (Graphics page) { // 검은 테두리를 그린다. page.setColor (Color.black); page.fillRect (x, y, width, height); // 하얀 안쪽 배경을 그린다. page.setColor (Color.white); page.fillRect (x + 5, y + 5, width - 10, height - 10); // 중앙에 숫자를 그린다. page.setFont (displayFont); int fontHeight = page.getFontMetrics().getHeight(); int strWidth = page.getFontMetrics().stringWidth(""+displayVal); page.drawString (""+displayVal, x + width/2 - strWidth/2, y + fontHeight/2 + height/2); }

카운트 다운 – CountDown.java // ********************************************************** // CountDown.java // // 10부터 카운트다운 하는 디지털 화면을 그린다. // 마우스를 클릭함으로써 화면을 멈추게 하거나 리셋할 수 있다. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CountDown extends JApplet { private final int DELAY = 200; private Timer timer; // --------------------------------------------------------- // 애니메이션을 포함하여 애플릿을 초기화한다. public void init() timer = new Timer (DELAY, null); getContentPane().add (new CountDownPanel(timer)); }

카운트 다운 – CountDown.java // --------------------------------------------------------- // 애플릿이 시작할 때 애니메이션을 시작한다. public void start() { timer.start(); } // 애플릿이 멈출 때, 애니메이션을 멈춘다. public void stop() timer.stop();

카운트 다운 – CountDownPanel.java // ********************************************************** // CountDownPanel.java // // 10부터 카운트다운 하는 디지털 화면을 위한 패널 // 마우스를 클릭함으로써 화면을 멈추게 하거나 리셋할 수 있다. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CountDownPanel extends JPanel { private final int WIDTH = 600; private final int HEIGHT = 400; private final int DISPLAY_WIDTH = 150; private final int DISPLAY_HEIGHT = 100; private final int DELAY = 200; private final int COUNT_START = 10; private DigitalDisplay clock; private Timer timer;

카운트 다운 – CountDownPanel.java // --------------------------------------------------------- // 애플릿을 설정한다. public CountDownPanel (Timer countdown) { // 타이머를 설정한다. setBackground (Color.blue); setPreferredSize (new Dimension (WIDTH, HEIGHT)); clock = new DigitalDisplay(COUNT_START, WIDTH/2 - DISPLAY_WIDTH, HEIGHT/2 - DISPLAY_HEIGHT, DISPLAY_WIDTH, DISPLAY_HEIGHT); } // ---------------- // 시계를 그린다. public void paintComponent (Graphics page) super.paintComponent (page); clock.draw(page);