티스토리 뷰
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 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크