2009-11-02 2 views
2

응용 프로그램의 JAR이 만들어지면 응용 프로그램의 이미지가 더 이상 나타나지 않습니다. 이미지를로드하기위한 Google 코드의 예는 다음과 같습니다.이미지가 .jar 파일에서 작동하지 않습니다.

ImageIcon placeHolder = new ImageIcon("src\\Cards\\hidden.png"); 

왜 이러한 일이 발생하는지 알 수 없습니다. JAR 파일로 압축하지 않으면 응용 프로그램이 예상대로 실행됩니다. JAR로서, 이미지는 단순히 사라집니다. 우리는 ImageIcons 대신 URL을 사용하여 시도했지만 프로그램이 전혀 실행되지 않게합니다.

아이디어가 있으십니까?

EDIT : 올바른 경로로 이미지 파일을 JAR 파일에 저장하므로 문제가되지 않습니다.

+0

은 .jar 파일의 위치와 관련하여 올바르게 설정된 이미지의 위치입니까? –

+1

http://stackoverflow.com/questions/31127/java-swing-displaying-images-from-within-a-jar – jjnguy

답변

7

호출중인 constructor에 대한 API를 확인하십시오. 전달하는 문자열은 파일 경로입니다. 리소스가 JAR에 패키지되어있을 때 이미지가 포함 된 파일 시스템에는 파일이 없으므로이 생성자를 더 이상 사용할 수 없습니다. 대신

당신은 클래스 로더를 사용하여 스트림에서 리소스를로드해야하고, 바이트 배열로 끌어 것 :

byte[] buffer = new byte[IMAGE_MAX_SIZE]; 
InputStream imageStream = getClassLoader().getResourceAsStream("src\Cards\hidden.png"); 
imageStream.read(buffer, 0, IMAGE_MAX_SIZE); 
ImageIcon placeHolder = new ImageIcon(buffer); 

물론, 더 예외 가장자리의 경우 처리를 필요로하지만, 그건 그것의 요지.

+1

'MyClass.class.getClassLoader()'. 앞으로 슬래시는 적어도 선호 될 것입니다. 그리고'read'는 항상 전체 버퍼를 읽지는 않습니다 (예를 들어,'DataInputStream.readFully'). –

+3

getClass(). getResource ("image.png")를 사용하여 이미지를로드하는 간단한 방법이 있습니다. 이것은 파일 시스템 또는 jar에 대해 올 Y 른 URL을 리턴합니다. 이 URL은 여러 가지 방법으로 새로운 ImageIcon (URL) –

2

당신은 같은 클래스 패스에서 리소스를로드해야합니다 :

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("Cards/hidden.png") 

이 과정의 당신은 JAR를 만들 때, 당신이 실제로 그것으로 이미지 파일을 가하고 있다고 가정합니다.

getting the resource as a URL에 대한 방법도 있습니다.

+0

javadoc에서 연결된 위치 : "리소스 이름은 '/'로 구분 된 경로입니다. 자원을 식별하는 이름. " 백 슬래시를 사용하는 예에서 경로를 수정하려면 다음을 수행하십시오. – Grundlefleck

1

질문 : src 폴더가 항아리에 있습니까?

: ZIP을 지원하는 풀기 프로그램을 사용하여 .jar 파일을 열 수 있습니다.

응답 : 리소스를 참조하는 방식이 올바르지 않으므로 대신 getClass().getClassLoader().getResource("Cards/hidden.png")과 같은 작업을 수행해야합니다.

+0

왜 "올바르지 않습니다"? – akbiggs

+1

클래스 경로 리소스가 아닌 상대 디스크 파일 시스템 경로로 사용하기 때문에. – BalusC

관련 문제