7장 배열 ③.

Slides:



Advertisements
Similar presentations
6 장 객체 - 지향 설계 ③. 목차 GUI 레이아웃  전화기 키 패드 전화기 키 패드 전화기 키 패드 모양의 GUI 를 만드는 Telephone.java, TelephonePanel.java 를 완성해 보자.  주석을 참고하여 TelephonePanel.java.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
자바 5.0 프로그래밍.
어서와 Java는 처음이지! 제3장선택과 반복.
명품 JAVA Essential.
- 계산기 GUI 구성하기 - 조원: 박강국 오정은 이귀식 김도윤 안영진.
Ch.22 Command Pattern 장 덕 성 계명대학교 컴퓨터공학과 정보공학실험실
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
9장. 스윙 프로그래밍.
GUI 이벤트, 이벤트 리스너와 이벤트 소스 그림 그리기 내부 클래스
제7장 이벤트 프로그래밍.
레이아웃 관리자 스윙 구성요소 비트박스 프로그램
명품 JAVA Programming 제 13 장 스레드와 멀티태스킹.
컴퓨터 프로그래밍 실습 #7 제 4 장 GUI 클래스 작성.
명품 JAVA Essential.
명품 JAVA Programming.
8장 상속 ②.
Chap14 스윙(SWING) 14.1 스윙 컴포넌트 14.2 컴포넌트의 이벤트 처리
제 4 장 클래스 작성 Lab 4- 2.
9장 AWT(1).
2. 자바 애플릿.
명품 JAVA Programming.
명품 JAVA Programming 제 12 장 그래픽.
Choi Younghwan CSE HUFS
java.awt 패키지의 단순 컴포넌트와 이벤트 처리
Chapter 12. Awt와 Swing Chapter 13. 배치 관리자 Chapter 14. 이벤트 관리자
Java로 배우는 디자인패턴 입문 Chapter 22. Command 명령을 클래스로 만든다
Swing 컴포넌트 텍스트 컴포넌트 텍스트 필드 텍스트 영역 스크롤 페인 체크 박스 라디오 버튼.
이벤트 프로그래밍 안혜선.
프로그래밍 개론 Ⅰ 제 3장. 클래스와 객체의 사용 ②.
Java Seminar Chapter 4.
9장 다형성 Lab 9-2.
10장 예외 Lab 10-2.
명품 JAVA Essential.
5장 조건과 반복 ③.
명품 Java Programming.
최용술 장 Thread 최용술
명품 JAVA Essential.
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
메모장 구동.
9장 AWT(1).
GUI 프로그래밍과 AWT 컴퓨터 공학실험(I) 인공지능 연구실.
명품 JAVA Programming 제 15 장 애플릿과 멀티미디어.
김 정 석 Web Programming 김 정 석
주소록 프로그램.
제 9주 이벤트 처리 그래픽프로그래밍1 제 9주 강의 목표
그래픽 사용자 인터페이스와 사건처리.
4장 Random Number 프로그래밍 언어 실험실 석사 3학기 박중기
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
4 장 클래스 작성.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
JAVA WINDOW PROGRAMMING
Java Chapter 4 ~ 주차.
컴퓨터공학실습(I) 3주 인공지능연구실.
Chapter3 : 객체지향의 개념 3.1 객체지향(object-oriented)과
Chap02 객체 지향 개념 2.1 객체지향(object-oriented)과 절차지향(procedural-oriented)
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
제8장 쓰레드 프로그래밍.
[ 단원 06 ] 상속과 다형성.
제 4 장 클래스 작성 Lab 4- 2.
Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects)
GUI 프로그래밍과 AWT 컴퓨터 공학실험(I) 인공지능 연구실.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
윤 홍 란 4 장 클래스 작성 윤 홍 란
Chapter 4 클래스 작성.
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
5장 조건과 반복 ③.
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용
Presentation transcript:

7장 배열 ③

목차 배열과 GUI 마우스 이벤트 키 이벤트 다각형과 다선분 다각형 사람 그리기 라디오 버튼의 배열 마우스 클릭으로 원 그리기 마우스로 원 이동하기 키 이벤트 사람 움직이기

다각형 사람 그리기 바지를 그려보자. 머리를 그려보자. 머리카락을 그려보자. 셔츠 앞에 지그재그 무늬를 넣어보자. pantsX 배열, pantsY 배열을 추가한다. 각 배열에 바지를 그릴 값을 넣는다. 머리를 그려보자. 변수 headX, headY를 추가한다. Polygon()를 사용하지 않고 원을 사용한다. 머리카락을 그려보자. hairX 배열, hairY 배열을 추가한다. 셔츠 앞에 지그재그 무늬를 넣어보자. polyline을 사용한다.

다각형 사람 그리기 (Cont.) movePerson(int x, int y)를 추가한다. 여러 명을 그려보자. 주어진 x, y에 따라 사람을 이동한다. 셔츠, 바지, 머리, 머리카락, 지그재그 무늬에 적용해야 한다. 여러 명을 그려보자. paintComponent()에 loop을 추가해 3명을 그린다. 3명의 간격을 150pixel로 한다.

다각형 사람 그리기 (Cont.) - DrawPerson.java //******************************************************* // DrawPerson.java // 사람을 그리기 위해 그래픽 메소드를 사용한다. import javax.swing.JFrame; public class DrawPerson { public static void main(String[] args) //--------------------------------------------------- // draw 프로그램을 위한 main frame 생성. JFrame frame = new JFrame("Draw Person"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); DrawPersonPanel panel = new DrawPersonPanel(); frame.getContentPane().add(panel); frame.pack(); frame.setVisible(true); }

다각형 사람 그리기 (Cont.) - DrawPersonPanel.java //******************************************************* // DrawPersonPanel.java // 사람을 그리기 위해 그래픽 메소드를 사용한다. import javax.swing.JPanel; import java.awt.*; public class DrawPersonPanel extends JPanel { private final int WIDTH = 600; private final int HEIGHT = 400; private int[] shirtX = {60, 0, 20, 60, 50, 130, 120, 160, 180, 120}; private int[] shirtY = {100, 150, 180, 160, 250, 250, 160, 180, 150, 100}; //--------------------------------------------------- // 구성자 : panel을 구성. public DrawPersonPanel() setPreferredSize(new Dimension(WIDTH, HEIGHT)); }

다각형 사람 그리기 (Cont.) - DrawPersonPanel.java //--------------------------------------------------- // 사람 그리기. public void paintComponent(Graphics page) { page.setColor (Color.blue); page.fillPolygon (shirtX, shirtY, shirtX.length); }

라디오 버튼의 배열 배열 colorButton을 추가한다. ButtonGroup객체,ColorListener객체를 초기화한다. 배열 크기는 NUM_COLORS, 라디오 버튼 타입의 객체 colorButton을 초기화한다. 각 label에 색깔을 표현한다. ButtonGroup객체,ColorListener객체를 초기화한다. 아래 4가지를 loop에서 실행한다. 각 라디오 버튼을 ButtomGroup에 추가한다. 배경색은 흰색으로 초기화한다. ColorListener를 추가한다. button을 panel에 추가한다.

라디오 버튼의 배열 (Cont.) actionPerformed()의 body를 작성한다. button을 눌렀을 때 배경색이 적절하게 바뀔 수 있도록 한다. button이 선택되었을 때 isSelected()를 사용한다. 예 : cololButton[i].isSelected() color 배열을 사용하여 배경색을 설정한다.

라디오 버튼의 배열 (Cont.) - ColorOptions.java //******************************************************* // ColorOptions.java // 배경색을 바꾸는 라디오 버튼의 배열을 사용. import javax.swing.*; public class ColorOptions { //--------------------------------------------------- // 배경색 변경을 위한 panel을 생성, 보여준다. public static void main(String[] args) JFrame colorFrame = new JFrame ("Color Options"); colorFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); ColorOptionsPanel panel = new ColorOptionsPanel(); colorFrame.getContentPane().add(panel); colorFrame.pack(); colorFrame.setVisible(true); }

라디오 버튼의 배열 (Cont.) - ColorOptionsPanel.java //******************************************************* // ColorOptionsPanel.java // ColorOptions 프로그램을 위한 사용자 인터페이스를 // 보여준다. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ColorOptionsPanel extends JPanel { private final int WIDTH = 350, HEIGHT = 100, FONT_SIZE = 20; private final int NUM_COLORS = 5; private Color [] color = new Color[NUM_COLORS]; private JLabel heading; //--------------------------------------------------- // 구성자 : panel을 구성. public ColorOptionsPanel() // heading, colors를 구성한다. heading = new JLabel ("Choose the backgroud color!"); heading.setFont (new Font ("Helvetica", Font.BOLD, FONT_SIZE));

라디오 버튼의 배열 (Cont.) - ColorOptionsPanel.java color[0] = Color.yellow; color[1] = Color.cyan; color[2] = Color.red; color[3] = Color.green; color[4] = Color.magenta; // ButtonGroup 객체와 ColorListener 객체를 초기화한다. // panel을 구성한다. add (heading); setBackground (Color.yellow); setPreferredSize (new Dimension (WIDTH, HEIGHT)); // 라디오 버튼을 group하고, ColorListener를 추가하고, // 각각의 배경색을 구성하고, panel에 추가한다. } //******************************************************* // 라디오 버튼의 감청자 private class ColorListener implements ActionListener { //--------------------------------------------------- // 선택된 라디오 버튼에 따라 배경색이 바뀐다. public void actionPerformed (ActionEvent event)

마우스 클릭으로 원 그리기 void move(Point p)를 추가해보자. CirclesListener()를 수정해보자. in Circle class 원의 중심을 p로 하여 원을 이동한다. CirclesListener()를 수정해보자. 매번 새로운 원을 그리지 말고, 클릭한 지점에 이미 원이 있다면 기존의 원을 이동하도록 수정해보자. 원이 없다면 새로운 원을 그려라. boolean isInside(Point p)를 추가해보자. 원 안에 p의 여부를 확인한다. 힌트! 원의 중심과 p사이의 거리가 반지름보다 작으면 원 안에 p가 있다.

마우스 클릭으로 원 그리기(Cont.) mousePressed()를 수정해보자. in CirclesListener 원이 없다면 사용자가 클릭한 지점에서 원을 그린다. 화면에 이미 원이 있는 경우 사용자가 원 안에 클릭했을 때, 원이 사라지게 한다. 힌트! null값을 주고, 원을 다시 그린다. 사용자가 원 밖을 클릭했을 때, 원을 이동한다. mouseEntered(), mouseExited()를 작성한다. 마우스가 panel안에 있을 때 배경색은 흰색으로, 마우스가 panel밖에 있을 때 배경색은 파란색으로 바뀌게 한다. (setBackground() 사용)

마우스 클릭으로 원 그리기(Cont.) - Circles.java //******************************************************* // Circles.java // 마우스 이벤트를 보여준다. import javax.swing.JFrame; public class Circles { //--------------------------------------------------- // 응용 프레임을 생성하여 디스플레이한다. public static void main(String[] args) JFrame circlesFrame = new JFrame ("Circles"); circlesFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); circlesFrame.getContentPane().add (new CirclePanel()); circlesFrame.pack(); circlesFrame.setVisible(true); }

마우스 클릭으로 원 그리기(Cont.) - Circle.java //******************************************************* // Circle.java // 원을 생성하고 그린다. import java.awt.*; import java.util.Random; public class Circle { private int centerX, centerY; private int radius; private Color color; static Random generator = new Random(); //--------------------------------------------------- // 주어진 중심점에서 원을 생성한다. // - 반지름과 색깔은 무작위로 선택된다. // - 반지름 : 25~74, 색깔 : RGB 0~16777215(24bit) public Circle(Point point) radius = Math.abs(generator.nextInt())%50 + 25; color = new Color(Math.abs(generator.nextInt())%16777216); centerX = point.x; centerY = point.y; }

마우스 클릭으로 원 그리기(Cont.) - Circle.java //--------------------------------------------------- // 원을 그린다. public void draw (Graphics page) { page.setColor(color); page.fillOval(centerX-radius, centerY-radius, radius*2, radius*2); }

마우스 클릭으로 원 그리기(Cont.) - CirclePanel.java //******************************************************* // CirclePanel.java // Circle 프로그램을 위한 사용자 인터페이스를 제공한다. import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class CirclePanel extends JPanel { private final int WIDTH = 600, HEIGHT = 400; private Circle circle; //--------------------------------------------------- // 마우스 이벤트를 위한 panel을 구성한다. public CirclePanel() addMouseListener (new CirclesListener()); setPreferredSize (new Dimension(WIDTH, HEIGHT)); }

마우스 클릭으로 원 그리기(Cont.) - CirclePanel.java //--------------------------------------------------- // 원을 그린다. public void paintComponent (Graphics page) { super.paintComponent (page); if (circle != null) circle.draw(page); } //******************************************************* // 마우스 이벤트 감청자. private class CirclesListener implements MouseListener // 마우스 버튼이 눌려질 때 현 위치에 새로운 원을 그린다. public void mousePressed (MouseEvent event) circle = new Circle(event.getPoint()); repaint();

마우스 클릭으로 원 그리기(Cont.) - CirclePanel.java //--------------------------------------------------- // 사용하지 않는 이벤트 메소드 public void mouseClicked (MouseEvent event) {} public void mouseReleased (MouseEvent event) {} public void mouseEntered (MouseEvent event) {} public void mouseExited (MouseEvent event) {} }

마우스로 원 이동하기 void move(Point p)를 추가해보자. in Circle class 원의 중심을 p로 하여 원을 이동한다. CirclePanel 구성자에 CirclesListener 객체를 생성한다. 마우스 이벤트와 마우스 이동 이벤트를 위한 것! CirclesListener class를 수정한다. heading : CirclesListener implements MouseMotionListener mouseDragged() : 원을 이동(getPoint()), 다시 그림. mouseMoved() : 공백 정의.

사람 움직이기 MovePanel.java를 수정해보자. 위, 아래로 움직이는 키를 추가해보자. s 키를 눌렀을 때, 사람 키의 50%로 줄인다. u 키를 눌렀을 때, 팔을 올리고 다리는 내린다. 예 : stickMan.setArmPosition(60); strickMan.setLegPosition(40); m 키를 눌렀을 때, 팔과 다리가 수평이 되도록 한다. arm position 은 0, leg position은 20 d 키를 눌렀을 때, 팔은 내려가고 다리는 올라오도록 한다. arm position 은 -60, leg position은 10

사람 움직이기 (Cont.) - MoveStickMan.java //******************************************************* // MoveStickMan.java // // 사람을 이동하여 키 이벤트를 사용해본다. import javax.swing.*; public class MoveStickMan { //--------------------------------------------------- // 응용 프레임을 생성하고 디스플레이한다. public static void main(String[] args) JFrame frame = new JFrame ("Moving a Stick Figure"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new MovePanel()); frame.pack(); frame.setVisible(true); }

사람 움직이기 (Cont.) - StickFigure.java //******************************************************* // StickFigure.java // // 사람을 표현한다. import java.awt.*; public class StickFigure { private int baseX; private int baseY; private Color color; private int height; private int headW; private int legLength; private int legPosition; private int armLength; private int armToFloor; private int armPosition;

사람 움직이기 (Cont.) - StickFigure.java //--------------------------------------------------- // 구성자 : 주어진 4개의 값으로 사람을 구성한다. public StickFigure (int center, int bottom, Color shade, int size) { baseX = center; baseY = bottom; color = shade; height = size; // 키에 비례하는 몸의 위치 headW = height / 5; legLength = height / 2; armToFloor = 2 * height / 3; armLength = height / 3; // 팔과 다리의 위치를 초기화 armPosition = -20; legPosition = 15; }

사람 움직이기 (Cont.) - StickFigure.java //--------------------------------------------------- // 사람을 그린다. public void draw (Graphics page) { // 머리 꼭대기의 y축 계산하기. int top = baseY - height; page.setColor(color); // 머리 그리기. page.drawOval(baseX-headW/2, top, headW, headW); // 트럭 그리기. page.drawLine(baseX, top+headW, baseX, baseY - legLength); // 다리 그리기. page.drawLine(baseX, baseY-legLength, baseX-legPosition, baseY); page.drawLine(baseX, baseY-legLength, baseX+legPosition, baseY); // 팔 그리기. int startY = baseY - armToFloor; page.drawLine(baseX, startY, baseX-armPosition, startY-armPosition); page.drawLine(baseX, startY, baseX+armPosition, startY-armPosition); }

사람 움직이기 (Cont.) - StickFigure.java //--------------------------------------------------- // 사람을 움직인다. // - over : 양의 값이면 오른쪽, 음의 값이면 왼쪽 // - down : 양의값이면 아래쪽, 음의 값이면 위쪽 public void move (int over, int down) { baseX += over; baseY += down; } // factor의 값에 따라 키 조정하기 // - if factor > 1: 증가 // - else 감소 public void grow (double factor) height = (int) (factor * height); // 새키에 비례하여 몸의 위치를 조정해준다. headW = height / 5; legLength = height / 2; armToFloor = 2 * height / 3; armLength = height / 3;

사람 움직이기 (Cont.) - StickFigure.java //--------------------------------------------------- // 새로운 값으로 다리 위치를 조정한다. // - 다리 위치 : vertical로부터의 거리 public void setLegPosition (int newPosition) { legPosition = newPosition; } // 새로운 값으로 팔 위치를 조정한다. public void setArmPosition (int newPos) armPosition = newPos;

사람 움직이기 (Cont.) - MovePanel.java //******************************************************* // MovePanel.java // // 키 이벤트 프로그램을 위한 디스플레이 panel을 나타낸다. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MovePanel extends JPanel { private final int WIDTH = 600; private final int HEIGHT = 400; private final int JUMP = 5; private final int START_CENTER = WIDTH/2; private final int START_BOTTOM = HEIGHT - 40; private final int SIZE = HEIGHT / 2; private StickFigure stickMan;

사람 움직이기 (Cont.) - MovePanel.java //--------------------------------------------------- // 구성자 : panel을 설정한다. public MovePanel() { addKeyListener (new MoveListener()); stickMan = new StickFigure (START_CENTER, START_BOTTOM, Color.yellow, SIZE); setBackground (Color.black); setPreferredSize (new Dimension (WIDTH, HEIGHT)); setFocusable(true); } // 사람을 그린다. public void paintComponent (Graphics page) super.paintComponent (page); stickMan.draw (page);

사람 움직이기 (Cont.) - MovePanel.java //******************************************************* // 키보드 동작을 위한 감청자를 표현한다. private class MoveListener implements KeyListener { // 화살표 키는 수직, 수평으로 이동시킨다. // g ,s 키는 사람의 키를 조절하고, u,m,d 키는 팔과 다리를 움직인다. public void keyPressed (KeyEvent event) switch (event.getKeyCode()) case KeyEvent.VK_LEFT: stickMan.move(-1*JUMP, 0); break; case KeyEvent.VK_RIGHT: stickMan.move(JUMP, 0); case KeyEvent.VK_G: stickMan.grow(1.5); default: } repaint(); public void keyTyped (KeyEvent event) {} public void keyReleased (KeyEvent event) {}