티스토리 뷰

back/Java

KH 32일차(Swing, AWT 마무리)

devel0per 2022. 8. 16. 21:56

32일차인 오늘은 Swing을 통해 JFrame을 상속받아 받은 여러 이벤트 컴포넌트 객체를 실습했다.

 

(1) KeyListener을 통한 자동차 이미지 움직이기

 

☆ 실행코드

package ja_0816;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyCarTest_1 extends JFrame{
	
	public MyCarTest_1() {
		setSize(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add(new MyPanel());
		setVisible(true);
	}
	
	public static void main(String[] args) {
		MyCarTest_1 s = new MyCarTest_1();
	}
	
	class MyPanel extends JPanel{
		BufferedImage img = null;
		
		int img_x = 100, img_y = 100;
		
		public MyPanel() {
			try {
				img = ImageIO.read(new File("image/car_2.png"));
			} catch(IOException e) {
				System.out.println("no image");
				System.exit(1);
			}
			
			addKeyListener(new KeyListener(){
				public void keyPressed(KeyEvent e) {
					int keycode = e.getKeyCode();
					switch(keycode) {
					case KeyEvent.VK_UP:
						img_y -= 10;
						break;
					case KeyEvent.VK_DOWN:
						img_y += 10;
						break;
					case KeyEvent.VK_LEFT:
						img_x -= 10;
						break;
					case KeyEvent.VK_RIGHT:
						img_x += 10;
						break;
					}
					repaint();
				}
				
				public void keyReleased(KeyEvent arg0) {
					
				}
				
				public void keyTyped(KeyEvent arg0) {
					
				}
			});
			this.requestFocus();
			setFocusable(true);
		}
		
		public void paintComponent(Graphics g) { // 스윙 컴포넌트가 자신의 모양을 그리는 메소드
												 // 컴포넌트가 그려져야 하는 시점마다 호출
												 // 크기가 변경되거나, 위치가 변경되거나, 컴포넌트가 가려졌던 것이 사라지는 등
			super.paintComponent(g);
			g.drawImage(img, img_x, img_y, null);
		}
	}
}

★ 실행결과

KeyListener을 통해서 왼쪽,오른쪽,위,아래 방향키를 활용해서 차를 움직이게 할 수 있다.

 

(2) 람다식을 활용하여 공의 위치를 변경하면서 화면에 그려 공이 자유자재로 움직이게 만들기.

 

☆ 실행코드

package ja_0816;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Ball_1 extends JPanel {
   static final int BOARD_WIDTH = 600;
   static final int BOARD_HEIGHT = 400;
   private Ball ball = new Ball();
   private Ball2 ball2 = new Ball2();

   public Ball_1() {
      this.setBackground(Color.YELLOW);
      Runnable task = () -> {
         while (true) {
            ball.update();
            ball2.update();

       //   람다식을 이용하여서 Runnable 객체를 생성한다.
      //   무한루프를 돌면서 공의 위치를 변경하고 화면에 다시 그린다. 50 밀리초 동안 쉰다. 
      
            repaint();
            try {
               Thread.sleep(50);
            } catch (InterruptedException ignore) {
            }
         }
      };
      new Thread(task).start();
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      ball.draw(g);
      ball2.draw(g);

   }

   public static void main(String[] args) {
      JFrame frame = new JFrame();
      frame.setSize(Ball_1.BOARD_WIDTH, Ball_1.BOARD_HEIGHT);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
      frame.add(new Ball_1());
   }
}

class Ball {

   // 공의 속성은 위치, 크기, 속도이다.
   private int x = 100;
   private int y = 100;
   private int size = 30;
   private int xSpeed = 10;
   private int ySpeed = 10;

   // 공을 화면에 그려주는 메소드이다.

   public void draw(Graphics g) {
      g.setColor(Color.RED);
      g.fillOval(x, y, size, size);
   }

   public void update() {
      x += xSpeed;
      y += ySpeed;
      if ((x + size) > Ball_1.BOARD_WIDTH - size || x < 0) {
         xSpeed = -xSpeed;
      }
      if ((y + size) > Ball_1.BOARD_HEIGHT - (size + 15) || y < 0) {
         ySpeed = -ySpeed;
      }
   }
}

class Ball2 {

   // 공의 속성은 위치, 크기, 속도이다.
   private int x = 250;
   private int y = 170;
   private int size = 20;
   private int xSpeed = 15;
   private int ySpeed = 8;

   // 공을 화면에 그려주는 메소드이다.

   public void draw(Graphics g) {
      g.setColor(Color.green);
      g.fillOval(x, y, size, size);
   }

   public void update() {
      x += xSpeed;
      y += ySpeed;
      if ((x + size) > Ball_1.BOARD_WIDTH - size || x < 0) {
         xSpeed = -xSpeed;
      }
      if ((y + size) > Ball_1.BOARD_HEIGHT - (size + 10) || y < 0) {
         ySpeed = -ySpeed;
      }
   }
}

★ 실행결과

 

(3) Fractal을 이용해서 자연의 나무 그려보기.

 

☆ 실행코드

package ja_0816;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Fractal_1 extends JFrame{
	
	public Fractal_1() {
		setSize(800, 700);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}
	
	
	int aa1 = 0;
	
	private void drawTree(Graphics g, int x1, int y1, double angle, int depth) {
		if(depth == 0)
			return;
		
		int xx1 = (int)(Math.random() * 25 + 1);
		int yy1 = (int)(Math.random() * 25 + 1);
		
		int x2 = x1 + (int)(Math.cos(Math.toRadians(angle)) * depth * xx1);
		int y2 = y1 + (int)(Math.sin(Math.toRadians(angle)) * depth * yy1);
		g.drawLine(x1, y1, x2, y2);
		drawTree(g, x2, y2, angle - 20, depth -1);
		drawTree(g, x2, y2, angle + 20, depth -1);
		drawTree(g, x2, y2, angle + 20, depth -1);
		
	}
	
	@Override
	public void paint(Graphics g) {
		g.setColor(Color.black);
		drawTree(g, 500, 600, -90, 10);
	}
	
	public static void main(String[] args) {
		new Fractal_1();
	}

}

 

★ 실행결과

 

 

'back > Java' 카테고리의 다른 글

KH 34일차(네트워크, 소켓프로그래밍)  (6) 2022.08.18
KH 33일차(IO Stream)  (0) 2022.08.17
KH 31일차(Swing)  (0) 2022.08.15
KH 30일차(Swing)  (0) 2022.08.11
KH 29일차(Graphics, Font, Image EVENT)  (5) 2022.08.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크