programing

이미지 리소스로드 중

projobs 2021. 1. 15. 07:31
반응형

이미지 리소스로드 중


내 GUI에 오류가 있습니다. 제목 표시 줄 아이콘을 설정하려고하면 Runnable JAR에 포함됩니다.

BufferedImage image = null;
try {
    image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif"));
} 
catch (IOException e) {
    e.printStackTrace();
}

frame.setIconImage(image);

내가 얻는 오류는 다음과 같습니다.

Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at GUI.<init>(GUI.java:39)
    at GUI.main(GUI.java:351)

이미지는 "resources"폴더가 프로젝트 파일의 루트 인 올바른 디렉토리에 있습니다.


먼저 다음 줄을 변경하십시오.

image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif"));

이에 :

image = ImageIO.read(getClass().getResource("/resources/icon.gif"));

두 접근 방식의 차이점에 대한 자세한 정보 는이 스레드에서 찾을 수 있습니다 . 리소스를로드하는 다른 방법

Eclipse의 경우 :

NetBeans의 경우 :

IntelliJ IDEA의 경우 :

  • 프로젝트 src 폴더를 마우스 오른쪽 버튼으로 클릭 합니다 . 새로 만들기-> 패키지 선택
  • 에서 새 패키지 대화 상자 , 패키지의 유형 이름을 말할 자원을 . 확인 클릭
  • 리소스 패키지를 마우스 오른쪽 버튼으로 클릭합니다 . 새로 만들기-> 패키지 선택
  • 에서 새 패키지 대화 상자 , 패키지의 유형 이름을 말할 이미지 . 확인 클릭
  • 이제 프로젝트에 추가 할 이미지를 선택하고 복사하십시오. IDE 내에서 resources.images 패키지를 마우스 오른쪽 버튼으로 클릭 하고 붙여 넣기를 선택합니다.
  • 마지막 링크를 사용하여 이제 Java 코드에서이 파일에 액세스하는 방법을 확인하십시오. 이 예에서는

    getClass().getResource("/resources/images/myImage.imageExtension");

  • Shift+를 눌러 F10프로젝트를 만들고 실행합니다. 자원과 이미지 폴더는 내부에 자동으로 만들어집니다 아웃 폴더에 있습니다.

수동으로 수행하는 경우 :

빠른 참조 코드 예제 (자세한 내용을 고려하려면 약간의 추가 설명 링크) :

package swingtest;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 7/1/14
 * Time: 9:44 AM
 * To change this template use File | Settings | File Templates.
 */
public class ImageExample {

    private MyPanel contentPane;

    private void displayGUI() {
        JFrame frame = new JFrame("Image Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new MyPanel();

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class MyPanel extends JPanel {

        private BufferedImage image;

        public MyPanel() {
            try {
                image = ImageIO.read(MyPanel.class.getResource("/resources/images/planetbackground.jpg"));
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return image == null ? new Dimension(400, 300): new Dimension(image.getWidth(), image.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new ImageExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

거기에있어 훨씬 쉬운 방법 프레임 아이콘 같은 이미지는 부하가 및 설정 :

frame.setIconImage(
    new ImageIcon(getClass().getResource("/resources/icon.gif")).getImage());

그리고 그게 전부입니다 :)! ImageIcon선언 된 예외를 throw하지 않기 때문에 try-catch 블록을 사용할 필요조차 없습니다. 으로 인해 getClass().getResource()응용 프로그램을 실행하는 방법에 따라 파일 시스템과 jar에서 모두 작동합니다.

If you need to check whether the image is available, you can check if the URL returned by getResource() is null:

URL url = getClass().getResource("/resources/icon.gif");
if (url == null)
    System.out.println( "Could not find image!" );
else
    frame.setIconImage(new ImageIcon(url).getImage());

The image files must be in the directory resources/ in your JAR, as shown in How to Use Icons and this example for the directory named images/.

ReferenceURL : https://stackoverflow.com/questions/9864267/loading-image-resource

반응형