Download presentation
Presentation is loading. Please wait.
1
7장 배열 ③
2
목차 배열과 GUI 마우스 이벤트 키 이벤트 다각형과 다선분 다각형 사람 그리기 라디오 버튼의 배열 마우스 클릭으로 원 그리기
마우스로 원 이동하기 키 이벤트 사람 움직이기
3
다각형 사람 그리기 바지를 그려보자. 머리를 그려보자. 머리카락을 그려보자. 셔츠 앞에 지그재그 무늬를 넣어보자.
pantsX 배열, pantsY 배열을 추가한다. 각 배열에 바지를 그릴 값을 넣는다. 머리를 그려보자. 변수 headX, headY를 추가한다. Polygon()를 사용하지 않고 원을 사용한다. 머리카락을 그려보자. hairX 배열, hairY 배열을 추가한다. 셔츠 앞에 지그재그 무늬를 넣어보자. polyline을 사용한다.
4
다각형 사람 그리기 (Cont.) movePerson(int x, int y)를 추가한다. 여러 명을 그려보자.
주어진 x, y에 따라 사람을 이동한다. 셔츠, 바지, 머리, 머리카락, 지그재그 무늬에 적용해야 한다. 여러 명을 그려보자. paintComponent()에 loop을 추가해 3명을 그린다. 3명의 간격을 150pixel로 한다.
5
다각형 사람 그리기 (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); }
6
다각형 사람 그리기 (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)); }
7
다각형 사람 그리기 (Cont.) - DrawPersonPanel.java
// // 사람 그리기. public void paintComponent(Graphics page) { page.setColor (Color.blue); page.fillPolygon (shirtX, shirtY, shirtX.length); }
8
라디오 버튼의 배열 배열 colorButton을 추가한다. ButtonGroup객체,ColorListener객체를 초기화한다.
배열 크기는 NUM_COLORS, 라디오 버튼 타입의 객체 colorButton을 초기화한다. 각 label에 색깔을 표현한다. ButtonGroup객체,ColorListener객체를 초기화한다. 아래 4가지를 loop에서 실행한다. 각 라디오 버튼을 ButtomGroup에 추가한다. 배경색은 흰색으로 초기화한다. ColorListener를 추가한다. button을 panel에 추가한다.
9
라디오 버튼의 배열 (Cont.) actionPerformed()의 body를 작성한다.
button을 눌렀을 때 배경색이 적절하게 바뀔 수 있도록 한다. button이 선택되었을 때 isSelected()를 사용한다. 예 : cololButton[i].isSelected() color 배열을 사용하여 배경색을 설정한다.
10
라디오 버튼의 배열 (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); }
11
라디오 버튼의 배열 (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));
12
라디오 버튼의 배열 (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)
13
마우스 클릭으로 원 그리기 void move(Point p)를 추가해보자. CirclesListener()를 수정해보자.
in Circle class 원의 중심을 p로 하여 원을 이동한다. CirclesListener()를 수정해보자. 매번 새로운 원을 그리지 말고, 클릭한 지점에 이미 원이 있다면 기존의 원을 이동하도록 수정해보자. 원이 없다면 새로운 원을 그려라. boolean isInside(Point p)를 추가해보자. 원 안에 p의 여부를 확인한다. 힌트! 원의 중심과 p사이의 거리가 반지름보다 작으면 원 안에 p가 있다.
14
마우스 클릭으로 원 그리기(Cont.) mousePressed()를 수정해보자.
in CirclesListener 원이 없다면 사용자가 클릭한 지점에서 원을 그린다. 화면에 이미 원이 있는 경우 사용자가 원 안에 클릭했을 때, 원이 사라지게 한다. 힌트! null값을 주고, 원을 다시 그린다. 사용자가 원 밖을 클릭했을 때, 원을 이동한다. mouseEntered(), mouseExited()를 작성한다. 마우스가 panel안에 있을 때 배경색은 흰색으로, 마우스가 panel밖에 있을 때 배경색은 파란색으로 바뀌게 한다. (setBackground() 사용)
15
마우스 클릭으로 원 그리기(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); }
16
마우스 클릭으로 원 그리기(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~ (24bit) public Circle(Point point) radius = Math.abs(generator.nextInt())% ; color = new Color(Math.abs(generator.nextInt())% ); centerX = point.x; centerY = point.y; }
17
마우스 클릭으로 원 그리기(Cont.) - Circle.java
// // 원을 그린다. public void draw (Graphics page) { page.setColor(color); page.fillOval(centerX-radius, centerY-radius, radius*2, radius*2); }
18
마우스 클릭으로 원 그리기(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)); }
19
마우스 클릭으로 원 그리기(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();
20
마우스 클릭으로 원 그리기(Cont.) - CirclePanel.java
// // 사용하지 않는 이벤트 메소드 public void mouseClicked (MouseEvent event) {} public void mouseReleased (MouseEvent event) {} public void mouseEntered (MouseEvent event) {} public void mouseExited (MouseEvent event) {} }
21
마우스로 원 이동하기 void move(Point p)를 추가해보자.
in Circle class 원의 중심을 p로 하여 원을 이동한다. CirclePanel 구성자에 CirclesListener 객체를 생성한다. 마우스 이벤트와 마우스 이동 이벤트를 위한 것! CirclesListener class를 수정한다. heading : CirclesListener implements MouseMotionListener mouseDragged() : 원을 이동(getPoint()), 다시 그림. mouseMoved() : 공백 정의.
22
사람 움직이기 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
23
사람 움직이기 (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); }
24
사람 움직이기 (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;
25
사람 움직이기 (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; }
26
사람 움직이기 (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); }
27
사람 움직이기 (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;
28
사람 움직이기 (Cont.) - StickFigure.java
// // 새로운 값으로 다리 위치를 조정한다. // - 다리 위치 : vertical로부터의 거리 public void setLegPosition (int newPosition) { legPosition = newPosition; } // 새로운 값으로 팔 위치를 조정한다. public void setArmPosition (int newPos) armPosition = newPos;
29
사람 움직이기 (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;
30
사람 움직이기 (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);
31
사람 움직이기 (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) {}
Similar presentations