2012-06-04 4 views
2

저는 현재 Java에 대한 책을 읽었으며 현재 스윙 그래픽 사용자 인터페이스 구성 요소를 연구 중입니다. 내가 그렇게 동안, 나는 저자가 매우 특이한 방법으로하는 JButton에 이미지를 설정, 아래에 묘사 된 코드 예제, 우연히 :JButton 및 ImageIcon 관련

일을 위 위해서는
Icon bug1 = new ImageIcon(getClass().getResource("bug1.gif")); 

을 수행해야 .class 파일과 같은 폴더에 이미지가 있어야합니다. 누군가가이 특정 코드를 사용하는 이유를 설명 할 수 있습니까? (내가 아는 한 리플렉션 코드 여야합니다.하지만 다시 한 번,이 코드에 대해 특히 확신하지 못합니다.) 그리고 내가 수행 할 수있는 한 가지 방법이 있다면 똑같은 일을, 그가하는 것처럼 복잡하게하지 않고?

답변

4

상황이 이해가되지 않는 경우에만 복잡합니다. 위 코드가 무엇을하는지 이해하면 매우 간단해질 것입니다.

getClass()은 현재 개체 (this)의 Class 개체를 반환합니다. getResource()은 위와 같이 상대 경로로 호출되며 클래스 경로에서 bug1.gif라는 파일을 찾고 호출중인 Class 객체와 동일한 패키지에서 파일을 찾습니다. 따라서 위의 코드가 포함 된 클래스와 동일한 패키지에서 bug1.gif를 찾습니다. getResource()은 URL을 반환합니다. 그리고 ImageIcon 생성자는 URL을 인수로 사용하여이 URL에서 이미지 바이트를로드하고이 바이트에서 ImageIcon을 구성합니다.

그래서이 코드를 호출하는 클래스와 동일한 패키지에있는 클래스 패스에서 사용할 수있는 파일에서 ImageIcon이 만들어집니다. 그리고 이것은 의미가 있습니다 : 주어진 클래스에 의해 사용 된 이미지를 클래스와 같은 패키지에 넣고 클래스와 응용 프로그램의 이미지를 포함하는 jar를 해제합니다.

이 모든 방법의 javadoc을 읽으면 모든 것을 직접 알아낼 수 있습니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 위의 코드가 수행 한 작업을 이미 이해 했었습니다. 적어도 의미는 있지만, 내가 설명해주는 것보다 더 나은 사람을 원했습니다. 바로 처음부터. 다시 답변을 제공해 주셔서 감사합니다. – NlightNFotis

+1

나는 당신의 의심과 이상한 점에 정말로 대답하지 못했다는 것을 깨달았습니다. 간단하고 쉬운 방법은 없습니다. (그러나 나는 그것이 더 간단해질 수있는 방법을 알지 못합니다.) 전혀 이상한 방법이 아닙니다. 그것은 전형적인 것입니다. 그것을하는 방법. –

2

Class#getResource(String)은 classpath에서 resource에 대한 URL을 반환합니다. 이는 응용 프로그램 JAR 파일 내에 저장된 자원을로드하는 편리한 방법입니다. 이미지가 HDD에 어딘가에 놓여 있다면, 당신은 사용하여로드 할 수

File 객체를 생성하고,이 URL과 같은 경로를 ( file:///path/to/the/image처럼 보일 것이다)의 취득
new ImageIcon(new File("/path/to/the/image").toURI().toURL()); 

. ImageIcon

또는 더 쉽게

은 파일 이름을 소요 생성자가 있습니다

new ImageIcon("/path/to/the/image"); 
+0

* "JButton의 이미지"*는 임베디드 리소스임을 나타냅니다. 'File' 객체는 Jar의 리소스에 액세스하기에 적합하지 않습니다. –

+0

그 이유는 내가 이미지가 HDD_의 어딘가에있을 때 특별히 썼다는 이유입니다.자바 클래스 패스에서 파일 (리소스)을 열면 복잡해지며 초보자도 이해하기 어려울 수 있습니다. (시간이 좀 걸렸습니다.) 필자는 외부 파일과 함께 작동하는 방법을 보여줌으로써 사례를 단순화하고자했습니다. - 이해하기 쉽습니다. – npe

+0

'toURI(). toURL()'을 사용하면 파일 이름에 URL로 이스케이프해야하는 문자가 포함 된 경우라고 생각합니다. 이는 거의 드문 경우입니다. 아니면 설명 할 수 있니? – npe

2

자바의 스윙이 복잡 정말 빨리 극복 할 수 있습니다 나는 그가 실제로 단순이 코드를 사용하여 생각.

이미지 경로가 상대 경로 인 경우 (예제의 경로가있는 경우) 이미지는 프로그램의 컴파일 된 바이트 코드 인 .class 파일과 같은 위치에 있어야합니다. 이미지가 다른 곳에 있다면, 당신의 프로그램은 그것을 찾지 못했습니다.

이와 같은 상대 경로는 특히 완성 된 프로젝트를 JAR 파일로 컴파일하려는 경우 매우 유용합니다. 이미지는 모든 .CLASS 파일과 함께 JAR에 포함됩니다. 컴파일 프로그램을 다운로드하여 실행할 수 있으며 이미지가 GUI에 바로 표시 될 것입니다.