Presentation is loading. Please wait.

Presentation is loading. Please wait.

8장 상속 ②.

Similar presentations


Presentation on theme: "8장 상속 ②."— Presentation transcript:

1 8장 상속 ②

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

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

4 화면에 점 찍기 – 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); }

5 화면에 점 찍기 – 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)); }

6 화면에 점 찍기 – 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();

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

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

9 움직이는 웃는 얼굴 – 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); }

10 움직이는 웃는 얼굴 – 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(); }

11 움직이는 웃는 얼굴 – 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();

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

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

14 카운트 다운 – 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); }

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

16 카운트 다운 – 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); }

17 카운트 다운 – 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)); }

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

19 카운트 다운 – 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;

20 카운트 다운 – 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);


Download ppt "8장 상속 ②."

Similar presentations


Ads by Google