Christmas Pikachu (Image Class, inner Class 활용), 이미지 파일 불러오는 법 - 2
개발일지/자바

(Image Class, inner Class 활용), 이미지 파일 불러오는 법 - 2

ZI_CO 2022. 9. 14.

package eventPractice;

import java.awt.Graphics;
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 MyBufferedImage extends JFrame{
	
	private BufferedImage backgroundImage; // BufferedImage형태의 배경이미지 멤버변수
	private BufferedImage player; // BufferedImage형태의 케릭터 멤버변수
	private final int PLAYER_WIDTH = 100; // player 케릭터 이미지의 가로 크기
	private final int PLAYER_HEIGHT = 100; // player 케릭터 이미지 세로 크기
	private MyImageDrawPanel drawPanel; // Inner Class 멤버변수 선언
	
	
	
	public MyBufferedImage() {
		initData();
		setInitLayout();
	}
	
	private void initData() {
		setTitle("이미지 불러오기 그림그리기 두번째 방법"); // 프레임 타이틀
		setSize(500,500); // 프레임 사이즈
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 프레임 종료시 프로그램 종료
	
		// 첫번째 방법에서는 inner class에서 파일을 불러오고 이미지 그림을 그렷다면 
		// 이번에는 일반 클래스에서 이미지 파일을 불러오고 inner class에서 그림을 그려보는 방법이다.
		
		try {
			backgroundImage = ImageIO.read(new File("background.jpg"));  // BufferedImage클래스 변수로 선언한 backgroundImage에
																													// ImageIO(이미지를 in,out)클래스에 접근을해 read 메소드에 new file을 해줘서
																													// 배경이미지의 파일명을 읽어온다.
			player = ImageIO.read(new File("player2.png"));// player이미지도 동일하게 파일을 읽어온다. ImageIO를 사용하게되면 try/ catch 필수
		} catch (IOException e) {	
			System.out.println("파일이 없거나 경로가 잘못 지정 되었습니다."); // catch 부분에서는 파일을 불러오 못했을때 예외처리를 해준다. (에러발생)
			e.printStackTrace();
		} 
			
		// 이미지를 잘 불러 왔으면 try / catch 에서 벗어나서 불러온 파일을 그려줘야한다.
		// Inner Class 에서 그려주는 기능을 만들워 놓았으니  일반 클래스에서 Inner Class를 멤버변수로 선언해주었다.
		// 이제 선언해준 Inner클래스를 new()를 해줘 생성을해서 배치를 해주게끔 준비해주면 된다.
		
		drawPanel = new MyImageDrawPanel(); //  inner클래스 생성해준뒤 그림까지 그려진 상태 이제 배치를 해주면된다.
	
	}
	
	private void setInitLayout() {
		setVisible(true);
		setLayout(null); //배치를 null을 해주게되면 좌표값으로 지정해서 위치를 정해주면된다.
		drawPanel.setLocation(0, 0); // 이미지를 그리는 기능이 시작 하는 위치 즉, 전체의 배경화면을 배치할때!!
		drawPanel.setSize(500,500); // 프레임사이즈가 500, 500 이기때문에 같이 똑같이 맞춰주면 된다
		add(drawPanel); // 이미지를 불러오고 그리고, 그리는 위치까지 다 설정이 됬으면 add를 시켜서 배치해주면 된다.
	}
	
	// private을 한 inner Class
	private class MyImageDrawPanel extends JPanel {
		
		// Jpanel을 상속을받아 그림을 그려주는 기능을 사용한다. paint메소드를 오버라이드 해주기 
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			// 배경의 이미지는 0, 0좌표에서  500, 500 사이즈만큼 그림을 그린다. 
			g.drawImage(backgroundImage, 0, 0, 500, 500, null); // 그림을 그리는 순서는 첫번째로 배경을 먼저 그리고, 케릭터를 그다음에 위에서 그려야 케릭터가 가려지지 않는다. 
			g.drawImage(player, 200, 200, PLAYER_WIDTH, PLAYER_HEIGHT, null); // 케릭터의 이미지 크기는 변하지않게 고정하기위해 상수로 값을 초기화 해주면 좋다.
			// 케릭터의 이미지는 200, 200의 좌표에서 상수값의 사이즈만큼 크기의 그림을 그린다.			
		}
	}
	
	// 프로그램 실행 메인
	public static void main(String[] args) {
		new MyBufferedImage();
	}
	
}

 

 

 

실행결과

댓글