최근 지식인에 올라온 질문 중 하나에 대해서 샘플 프로그램을 만들고 게시해본다.
Swing으로 Image를 JPanel에 삽입하고 + 버튼을 누르면 10% 확대, - 버튼을 누르면 10% 축소하는 프로그램
샘플코드에 사용한 이미지 파일

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

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

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

실제 구현 코드. 설명은 주석으로 달아놓았다.
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);
}
}
}
댓글