[Java swing] 자바 스윙 7 : BufferedImage 활용한 이미지 삽입, 패널을 활용한 이미지 삽입

728x90

[Java swing] 자바 스윙 7 : 이미지 삽입

 

drawImage() 메소드를 사용해서 이미지를 띄우는 방식은 오래되고 문제가 많은데다 코딩이 길어지는 문제가 있어서 다른 방법을 소개한다.

 

자바는 자바가상머신 JVM을 이용해 프로그램을 구동하는데, 이미지 파일과 같은 메모리가 많이 필요한 데이터를 다룰 때, 어쩌다 메모리 자원을 확보하지 못하는 경우가 발생하기도 한다.

따라서 이용가능한 메모리를 사용해 미리 이미지를 처리해두는 이미지 버퍼를 사용해 만약의 상황을 방지하도록 한다.

 

먼저 src폴더에 대해 소스 폴더를 생성한다.

생성한 소스폴더에 이미지를 넣는다.

 

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class imgClass {
	public static void main(String[] args) throws IOException {
		File file = new File("./images/swing.png");
		BufferedImage img = ImageIO.read(file);
		JLabel label = new JLabel(new ImageIcon(img));
		JFrame frame = new JFrame("이미지 그리기");
		JPanel panel = new JPanel();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(panel);
		panel.add(label);
		frame.pack();
		frame.setLocation(0, 0);
		frame.setVisible(true);
	}
}

 

public class imgClass {
	public static void main(String[] args) throws IOException {
		File file = new File("./images/swing.png");

throws IOException은 파일이 존재하지 않을 경우 에러가 발생하는 것을 방지하는 코드이다.

 

파일 객체를 생성하고 인수부분에 저장했던 이미지 파일의 경로를 지정해준다.

상위폴더로 이동해 images폴더로 접근해 swing.png를 선택한다.

 

		BufferedImage img = ImageIO.read(file);
		JLabel label = new JLabel(new ImageIcon(img));

BufferedImage 객체 이름을 img로 지정하고, ImageIO클래스의 read메서드를 이용해

file 이미지 객체를 img 객체에 할당해 준다.

 

JLabel label = new JLabel(new ImageIcon(img));
		JFrame frame = new JFrame("이미지 그리기");
		JPanel panel = new JPanel();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(panel);
		panel.add(label);
		frame.pack();
		frame.setLocation(0, 0);
		frame.setVisible(true);
	}
}

라벨 객체를 생성해 img 객체를 넣어준다.

최종적으로 frame위에 panel을 올리고, 그 위에 label을 올린다.

setLocation으로 라벨 컴포넌트의 위치를 설정한다.

 

주의사항

만약 윈도우빌더로 이미지를 올리려는 panel 또는 frame에 absolute Layout을 적용했다거나,

setLayout(null);을 적용하면 이미지가 제대로 나타나지 않는다.

 

 

 

 

화면을 꽉 채우지않고, 윈도우 빌더를 사용해 화면을 구성했을 때, 특정 위치에 이미지를 나타내려면 어떻게 해야할까?

위는 윈도우 빌더를 이용해 임의의 위치에 작은 패널을 올리고, 그 위에 이미지를 올린 결과이다.

 

먼저 윈도우 빌더로 패널을 만들어보자.

 

src 폴더 - new - other를 클릭한다.

 

imgTest라는 이름으로 폼을 생성했다.

자동으로 화면에 창을 띄우는 기본 코드가 입력되어 있다. Design버튼을 눌러 윈도우 빌더창으로 이동한다.

Layout에 있는 absolute Layout을 클릭, 그리고 getContentPane()을 클릭하면 

getContentPane() 패널에 올리는 컴포넌트들은 자유롭게 크기와 위치를 마우스 포인터로 조절할 수 있게 된다.

 

Containers의 JPanel을 클릭해 getContentPane() 위에 새로운 패널을 올려준다.

그럼 오른쪽 폼화면에 크기와 위치를 자유롭게 설정할 수 있도록 조절 포인터가 생긴다.

 

화면을 살짝 키우고 panel의 위치를 구석자리에 옮겨두었다.

이제 코드를 수정해서 panel위에 이미지를 올리도록 할 것이다.

 

Source 버튼을 눌러 원래 소스 코드 창으로 돌아온다.

 

전체 코드

import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class imgTest {

	private JFrame frame;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					imgTest window = new imgTest();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public imgTest() throws IOException { // 변경 부분
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
     
 // -----------------------------------------------[변경 부분
	private void initialize() throws IOException { 
		File file = new File("./images/KFC.jpg");
		BufferedImage img = ImageIO.read(file);
		
		JLabel label = new JLabel(new ImageIcon(img));
		frame = new JFrame();
		
		frame.setBounds(100, 100, 817, 529);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBounds(535, 232, 189, 190);
		frame.getContentPane().add(panel);
		
		panel.add(label);
 // -----------------------------------------------]
	}
}

전체적인 코드는 큰 차이가 없다. 

새로 만들었던 패널에 이지를 담고 있는 라벨을 그대로 올렸다.

대신 예외상황을 처리하는 throws IOException을 imgTest() 매소드와 initialize() 매소드에 작성해야 에러가 나지 않는다.

 

코드를 실행해 결과를 확인하자.

728x90