2013-05-10 49 views
2

我遇到了大量的問題,它將包含圖像的java程序打包成一個jar文件,用於轉換成可執行文件。圖像已被用於程序和按鈕的背景中。請參閱下圖,其中顯示了我希望轉換爲jar的程序。打包一個包含圖像的程序

IMAGE

enter image description here

正如你看到的上面的程序運行正常。我創建了沒有自定義背景和不包含圖像的自定義按鈕的相同程序,並且我成功將它打包成一個jar文件,然後放入一個.exe文件。

至於繪畫我的背景,我這樣做如下:

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); 
} 

至於與圖像創建我的4個自定義按鈕,我做了以下內容:

// 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); 

我試圖將圖像放在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

什麼是您的軟件包層次結構? – 2013-05-10 16:42:48

+0

只能在'paintComponent'內執行'g.drawImage'。並且在沒有觀察者的情況下調用getWidth/getHeight,那不是異步的。 – 2013-05-10 16:52:13

+0

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。但作爲一般建議。 '了setPreferredSize(大小); setMinimumSize(size); setMaximumSize(size); setSize(size); setLayout(null); g.drawImage(img,0,0,null);'不要調用'paintComponent()'方法中的第一個4的任何一個。不要將佈局設置爲null,因爲'JPanel'是一個'ImageObserver',最後一行應該是''g.drawImage(img,0,0,this);' – 2013-05-10 16:57:58

回答

6

第一次嘗試時,您正在從當前目錄(該目錄中啓動javaw命令的java命令所在的目錄)加載文件系統中的映像。這就是阻止您將圖像與應用程序捆綁在一起的原因。顯然,應用程序的最終用戶將不會在當前目錄中顯示圖像,並且他的當前目錄將根據他如何啓動應用程序而發生變化。

您應該將圖像打包在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。 – 2013-05-10 16:53:11

+3

同意氣墊船。設置組件的大小也不應該完成,當然也不能使用paintComponent()方法。相反,應該重寫getXxxSize()以返回圖像大小,以便佈局管理器正確佈置此組件。 – 2013-05-10 16:55:34

+1

@Hovercraft&JB:作爲參考,Andrew Thompson一直在更新[tag:embedded-resource]標籤[info](http://stackoverflow.com/tags/embedded-resource/info);嚴格審查的歡迎。 – trashgod 2013-05-10 19:27:19

相關問題