본문 바로가기
Java Programming/Swing

Java Swing의 JPanel에 Image 삽입하기

by 폴리글랏 2020. 11. 21.

최근 지식인에 올라온 질문 중 하나에 대해서 샘플 프로그램을 만들고 게시해본다.

 

Swing으로 Image를 JPanel에 삽입하고 + 버튼을 누르면 10% 확대, - 버튼을 누르면 10% 축소하는 프로그램

 

샘플코드에 사용한 이미지 파일

샘플 이미지

프로그램을 실행했을 때 기본 상태

100%의 이미지 (디폴트 상태)

+버튼을 2회 눌렀을 때 120%의 확대 상태

120%의 이미지 (+버튼 2회 누름)

-버튼을 2회 눌렀을 때 80%의 축소 상태

80%의 이미지 (-버튼 2회 누름)

실제 구현 코드. 설명은 주석으로 달아놓았다.

import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

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

// JFrame을 상속받는 ImageExample 클래스
public class ImageExample extends JFrame {
	// 이건 이클립스 경고 메세지를 없애기 위한 버전
	private static final long serialVersionUID = 1L;
	// 이미지를 저장할 apple과 가로 길이의 w, 세로 길이의 h
	private Image apple;
	private int w;
	private int h;

	public ImageExample() {
		super("그래픽 이미지 확대 프로그램");
		// 이미지 아이콘을 생성한다.
		ImageIcon appleIcon = new ImageIcon("images/apple.jpg");
		// 이미지 아이콘에서 가로 길이를 얻어온다.
		w = appleIcon.getIconWidth();
		// 이밎 아이콘에서 세로 길이를 얻어온다.
		h = appleIcon.getIconHeight();
		// 이미지 아이콘에서 이미지를 얻어온다.
		apple = appleIcon.getImage();
		// 컨테이너 c에 ContentPane을 얻어와서 담는다.
		// JFrame은 여러개의 Pane구조로 되어있다. 콘텐츠는 ContentPane에 담는다.
		Container c = this.getContentPane();
		// JPanel을 상속받은 ImagePanel을 생성한다.
		JPanel p = new ImagePanel();

		// 익명 이너클래스 형태로 키리스너를 구현해준다.
		// KeyListener를 상속받게 되면 3개의 추상메소드를 모두 오버라이드 해야한다.
		// 하지만 익명 이너클래스인 KeyAdapter를 상속받으면 1개만 구현해도 OK
		p.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				// e의 keyChar가 '+'라면
				if (e.getKeyChar() == '+') {
					// 가로 길이를 10% 만큼 증가
					w += (int) (w * 0.1);
					// 세로 길이를 10% 만큼 증가
					h += (int) (h * 0.1);
					// 다시 그린다.
					repaint();
				} else if (e.getKeyChar() == '-') {
					w -= (int) (w * 0.1);
					h -= (int) (h * 0.1);
					repaint();
				}
			}
		});
		// ContentPane에 ImagePanel을 add해준다.
		c.add(p);
		// 프레임의 X 버튼을 눌렀을 때 종료 이벤트
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 사이즈는 300 x 300으로
		this.setSize(300, 300);
		// 보여지기 여부 true
		this.setVisible(true);
		// 프레임이 띄어지자 마자 ImagePanel에 포커스를 준다.
		p.requestFocus();
	}

	public static void main(String[] args) {
		new ImageExample();
	}

	// 이너클래스 형태로 ImagePanel을 선언했다.
	class ImagePanel extends JPanel {
		// 이건 이클립스 경고 메세지를 없애기 위한 버전
		private static final long serialVersionUID = 1L;

		// 다시 그리는 paintComponent를 오버라이드
		@Override
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(apple, 10, 10, w, h, this);
		}
	}
}

댓글