2013-05-10 3 views
2

이미지를 포함하는 자바 프로그램을 변환 및 실행 파일로 패키징하는 중대한 문제가 있습니다. 이미지는 프로그램과 버튼의 배경에서 사용되었습니다. jar 파일로 변환하고자하는 프로그램을 보여주는 아래 다이어그램을 참조하십시오.이미지가 포함 된 프로그램 패키지화

IMAGE

이 프로그램보다시피

enter image description here

확인을 실행합니다. 나는 사용자 정의 배경과 커스텀 버튼이없는 동일한 프로그램을 이미지를 포함하지 않는 것으로 만들었고 그것을 성공적으로 항아리에 그리고 .exe 파일로 성공적으로 패키징했습니다. 내가 같이이 일을하고있어 내 배경을 그리기에 관하여

은 다음과 같습니다

// Prepare rollover images 
ImageIcon F1 = new ImageIcon("imgs/btn_f1_not_selected.jpg"); 
ImageIcon F1rollOver = new ImageIcon("imgs/btn_f1_selected.jpg"); 

// Create F1 button 
final JButton btnF1 = new JButton(F1); 
//btnF1.setOpaque(false); 
btnF1.setContentAreaFilled(false); 
btnF1.setBorder(null); 
btnF1.setBorderPainted(false); 
btnF1.setFocusPainted(false); 
btnF1.setRolloverIcon(F1rollOver); 

: 이미지 내 4 개 사용자 정의 버튼을 만드는 안부

public void paintComponent(Graphics g) { 
    Image img = new ImageIcon("imgs/Bgnd1.jpg").getImage(); 
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); 
    setPreferredSize(size); 
    setMinimumSize(size); 
    setMaximumSize(size); 
    setSize(size); 
    setLayout(null); 
    g.drawImage(img, 0, 0, null); 
} 

, 나는 다음과 같은 일을 해요 나는 이미지를 bin 폴더에 넣으려고 시도했고 배경을 만들기 위해 위의 방법을 이미지의 선언/가져 오기와 관련하여 변경했다.

public void paintComponent(Graphics g) { 
     String path = "Bgnd11.jpg"; 
     java.net.URL imgURL = getClass().getResource(path);  
     Image img = new ImageIcon(imgURL).getImage(); 
     Dimension size = new Dimension(img.getWidth(observer), img.getHeight(observer)); 
     setPreferredSize(size); 
     setMinimumSize(size); 
     setMaximumSize(size); 
     setSize(size); 
     setLayout(null); 
     g.drawImage(img, 0, 0, null); 
} 

또한 아래에 표시된대로 내 버튼의 생성에 필요한 이미지를 가져 오는 다음 내 버튼을 전달하는 시도했지만이 작동하지 않았다.

String path = "Bgnd11.jpg"; 
java.net.URL imgURL = getClass().getResource(path);  
Image img = new ImageIcon(imgURL).getImage(); 

찾는 방법 & 이미지를로드 하시겠습니까?

+0

패키지 계층 구조 란 무엇입니까? –

+0

'paintComponent' 안에'g.drawImage' 만합니다. 그리고 관찰자없이 getWidth/getHeight를 호출하면 비동기가 아닙니다. –

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 그러나 일반적인 조언. 'setPreferredSize (size); setMinimumSize (size); setMaximumSize (size); setSize (size); setLayout (null); g.drawImage (img, 0, 0, null);'첫 번째 4 개를'paintComponent()'메소드에서 호출하지 마십시오. 레이아웃을'null' ***로 설정하지 마십시오. *** JPanel은 ImageObserver이므로 마지막 행은 ..'g.drawImage (img, 0, 0, this);' –

답변

6

첫 번째 시도에서 javajavaw 명령이 시작된 디렉토리 인 현재 디렉토리에서 파일 시스템의 이미지를로드하고 있습니다. 이것이 이미지를 응용 프로그램과 묶는 것을 방지합니다. 당연히 앱의 최종 사용자는 현재 디렉토리에 이미지가 없으며 현재 디렉토리는 애플리케이션을 시작하는 방법에 따라 변경됩니다.

대신 이미지를 jar 파일 내에 패키지화하여 클래스 경로에 표시해야하므로 두 번째 시도에서 수행하는 것처럼 ClassLoader를 사용하여 이미지를로드해야합니다.

그들은 /resources/images이라는 항아리 폴더에 있으며, 패키지 resources.images에 해당한다고 가정 해 봅시다.

getClass().getResource("Bgnd11.jpg")을 사용하면 javadoc에서 나타내는 것처럼 getClass()이 반환 한 클래스와 동일한 패키지에서 Bgnd11.jpg을 찾으려고 시도합니다. 따라서 클래스가 패키지 resources.images에있는 경우이 예에서 작동합니다. 그렇지 않은 경우 리소스의 절대 경로를 사용해야합니다.

URL imgURL = getClass().getResource("/resources/images/Bgnd11.jpg"); 

또한 bin 폴더를 사용하지 마십시오. 이것은 Eclipse의 대상 폴더이며 깨끗한 빌드를 수행하면이 디렉토리의 모든 항목이 제거됩니다. 이미지를 소스 디렉토리의 해당 패키지에 추가하기 만하면 Eclipse는 프로젝트를 빌드 할 때이를 대상 디렉토리에 자동으로 복사합니다.

+1

1+ 추가 : 이미지를 읽지 않으려 고합니다. 'paint (...)'또는'paintComponent (...)'메소드를 사용하는 것이 좋습니다.이 메소드는 블라인딩 속도가 빠르며 파일이나 리소스 I/O가 아닌 그리기에만 관심을 가져야합니다. –

+3

호버 크라프트와 동의합니다. 컴포넌트의 크기를 설정하는 것은 또한하지 않아야하며, 확실히 paintComponent() 메소드가 아닙니다. 대신 레이아웃 관리자가이 구성 요소를 올바르게 배치하기 위해 이미지 크기를 반환하려면 getXxxSize()를 재정의해야합니다. –

+1

@Hovercraft & JB : 참고로 Andrew Thompson은 [tag : embedded-resource] 태그를 업데이트하고 있습니다 [info] (http://stackoverflow.com/tags/embedded-resource/info); 비평 검토 환영. – trashgod

관련 문제