Java 86(Image, ImageIcon)

Kang.__.Mingu·2024년 5월 20일
0

Java

목록 보기
88/108

Image

  • 그림파일(JPEG 파일, PNG 파일, GIF 파일 등)의 이미지 정보를 저장한 객체를 생성하기 위한 클래스

ImageIcon

  • 그림파일에 대한 정보가 저장된 객체를 생성하기 위한 클래스

  • ImageIcon(URL location)

    • 생성자의 매개변수에 그림파일의 정보가 저장된 URL 객체를 전달받아 ImageIcon 객체 생성
  • URL 클래스

    • 리소스 파일(그림파일, 소리파일, 동영상파일 등)의 시스템 파일 경로 또는 인터넷에 존재하는 파일 경로가 저장된 객체를 생성하기 위한 클래스
  • Object.getClass()

    • 현재 사용중인 클래스에 대한 정보가 저장된 Class 객체를 반환하는 메소드
  • Class.getResource(String name)

    • 현재 사용중인 클래스의 파일 경로를 기준으로 리소스 파일을 제공받아 리소스 파일의 경로 정보가 저장된 URL 객체를 반환하는 메소드
  • ImageIcon.getImage()

    • ImageIcon 객체에 저장된 그림 파일에서 이미지가 저장된 Image 객체를 반환하는 메소드

PenguinMoveApp

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;



// 키보드의 방향키를 누르면 펭귄 이미지가 움직이는 프로그램 작성
public class PenguinMoveApp extends JFrame {
    private static final long serialVersionUID = 1L;

    // 프레임의 폭과 높이를 저장한 상수필드 작성
    // => 배경 이미지의 폭과 높이로 사용하고 이벤트 처리 메소드에서 이동의 제한을 제공하기 위해 사용
    private static final int JFRAME_WIDTH=646;
    private static final int JFRAME_HEIGHT=461;

    // 펭귄 이미지의 폭과 높이를 저장한 상수필드 작성
    // => 이벤트 처리 메소드에서 이동의 제한을 제공하기 위해 사용
    private static final int PENGUIN_SIZE=50;

    // 배경 이미지를 저장하기 위한 필드
    // Image 클래스: 그림파일(JPEG 파일, PNG 파일, GIF 파일 등)의 이미지 정보를 저장한 객체를 생성하기 위한 클래스
    private Image backgroundImage;

    // 펭귄 이미지를 저장하기 위한 필드 - 배열
    private Image[] penguins;

    // 펭귄 이미지를 선택하는 값을 저장하기 위한 필드
    private int penguinNum;

    // 펭귄 이미지가 출력될 좌표값을 저장하기 위한 필드
    private int penguinX, penguinY;

    public PenguinMoveApp(String title) {
        super(title);

        // ImageIcon() 클래스: 그림파일에 대한 정보가 저장된 객체를 생성하기 위한 클래스
        // => ImageIcon(URL location) 생성자의 매개변수에 그림파일의 정보가 저장된 URL 객체를 전달받아
        // ImageIcon 객체 생성
        // URL 클래스: 리소스 파일(그림파일, 소리파일, 동영상파일 등)의 시스템 파일 경로 또는
        // 인터넷에 존재하는 파일 경로가 저장된 객체를 생성하기 위한 클래스
        // Object.getClass(): 현재 사용중인 클래스에 대한 정보가 저장된 Class 객체를 반환하는 메소드
        // Class.getResource(String name): 현재 사용중인 클래스의 파일 경로를 기준으로 리소스
        // 파일을 제공받아 리소스 파일의 경로 정보가 저장된 URL 객체를 반환하는 메소드
        // ImageIcon.getImage(): ImageIcon 객체에 저장된 그림 파일에서 이미지가 저장된 Image 객체를 반환하는 메소드
        backgroundImage = new ImageIcon(getClass().getResource("/images/back.jpg")).getImage();


        // Image 객체를 요소값으로 저장할 수 있는 배열을 생성하여 필드에 저장
        penguins = new Image[3];

        // 배열 요소값으로 펭귄 이미지 파일을 읽어 이미지 저장
        for(int i = 0; i < penguins.length; i++){
            penguins[i] = new ImageIcon(getClass().getResource("/images/penguin" + (i + 1) + ".gif")).getImage();
        }

        // penguinNum = 0;

        // 펭귄 이미지가 출력될 좌표값을 계산하여 필드에 저장
        // => 프레임 하단의 가운데 펭귄 이미지가 출력 되도록 설정
        penguinX = JFRAME_WIDTH / 2 - PENGUIN_SIZE / 2;
        penguinY = JFRAME_HEIGHT - PENGUIN_SIZE;

        // 프레임에서 키보드 관련 이벤트가 발생될 경우 이벤트를 처리하기 위해 이벤트 처리
        // 객체를 익명의 클래스로 생성하여 등록

        addKeyListener(new KeyAdapter() {
            // 키보드 버튼을 누르고 있는 상태인 경우 자동 호출되는 이벤트 처리 메소드
            @Override
            public void keyPressed(KeyEvent e) {
                // KeyEvent.getKeyCode(): 누르고 있는 키보드 버튼의 코드값을 반환하는 메소드
                // => KeyEvent.getKeyChar(): 누르고 있는 키보드 버튼의 문자값을 반환하는 메소드
                int keyCode = e.getKeyCode();

                // 이벤트가 발생된 키보드 버튼을 비교하여 명령을 선택 실행
                switch (keyCode){
                    // 이벤트가 발생된 키보드 버튼이 왼쪽 방향키인 경우
                    case KeyEvent.VK_LEFT:
                        penguinX -= 10;

                        if(penguinX <= 0){
                            penguinX = 0;
                        }

                        // 펭귄 이미지를 구분하기 위한 필드값을 변경
                        penguinNum++;
                        penguinNum %= penguins.length;

                        // Paint 메소드 호출
                        repaint();
                        break;

                    case KeyEvent.VK_RIGHT:
                        penguinX += 10;

                        if(penguinX >= JFRAME_WIDTH - PENGUIN_SIZE){
                            penguinX = JFRAME_WIDTH - PENGUIN_SIZE;
                        }

                        // 펭귄 이미지를 구분하기 위한 필드값을 변경
                        penguinNum++;
                        penguinNum %= penguins.length;

                        // Paint 메소드 호출
                        repaint();
                        break;
                }
            }
        });

        setResizable(false); // 프레임의 크기를 변경하지 않도록 설정
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(700,200,JFRAME_WIDTH, JFRAME_HEIGHT);
        setVisible(true);
    }

    public static void main(String[] args) {
        new PenguinMoveApp("펭귄 이동");
    }

    @Override
    public void paint(Graphics g) {
        //super.paint(g);

        //Graphics.drawImage(Image image, int x, int y, int width, int height, ImageObserver observer)
        // => 컴퍼넌트(ImageObserver 객체)에 이미지를 그리는 메소드
        g.drawImage(backgroundImage, 0, 0, JFRAME_WIDTH, JFRAME_HEIGHT, this);

        g.drawImage(penguins[penguinNum], penguinX, penguinY, PENGUIN_SIZE, PENGUIN_SIZE, this);
    }
}
profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글