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();
}
}
실행결과
'개발일지 > 자바' 카테고리의 다른 글
콜백 매소드 (0) | 2022.09.16 |
---|---|
Paint(좌표값을 이용한 그림 그리는 방법) (0) | 2022.09.14 |
(Image Class, inner Class 활용), 이미지 파일 불러오는 법 - 1 (0) | 2022.09.14 |
GridLayout(배열, ArrayList활용) (1) | 2022.09.13 |
BorderLayout(배열, ArrayList활용) (0) | 2022.09.13 |
댓글