2014-04-02 49 views
0

以下代碼在Eclipse中正常工作(包括圖像處理可能性)。但是,當作爲Runnable JAR文件導出並雙擊.JAR時,沒有任何反應。如果我註釋掉代碼的圖像部分,則.JAR可以很好地作爲導出並且框架生成。所以看起來圖像的獲取導致.JAR失敗。Java Swing:包含圖像時可運行的JAR文件不起作用

我得到了坐在'C:\ Users \ sean \ workspace \ myApps \ bin \ testing'中的strawberry.jpg文件。你能否告訴我這個問題是否與我的代碼一樣?

(代碼這裏先修改:Java Swing: unable to load image using getResource

package testing; 

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



public class IconTest { 


public static void main(String[] arguments) throws IOException { 

    JFrame frame1 = new JFrame(); 
    frame1.setTitle("Frame1"); 
    frame1.setSize(500, 500); 
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    FlowLayout flo = new FlowLayout(); 
    frame1.setLayout(flo); 

    //POSSIBILITY 1 TO HANDLE IMAGE 
     InputStream resourceAsStream = IconTest.class.getResourceAsStream("strawberry.jpg"); 
    Image image = ImageIO.read(resourceAsStream); 
    JLabel label1 = new JLabel(new ImageIcon(image)); 

    //POSSIBILITY 2 TO HANDLE IMAGE 
/* java.net.URL url= IconTest.class.getResource("strawberry.jpg"); 
    BufferedImage watermarkImage = ImageIO.read(url); 
    JLabel label1 = new JLabel(new ImageIcon(watermarkImage));*/ 


    frame1.add(label1); 
    frame1.setVisible(true); 
} 

}

+0

如果您在不同的系統中執行,請提取jar並檢查是否包含圖像。 – Shriram

+0

一種可能性是你可以在將'JLabel'作爲'ImageIcon'包含在它之前檢查'if(image!= null)',如果它爲null,你可以用一些替代文本創建'JLabel' ... –

+1

Aren' t應用程序需要存儲在資源目錄中的資源?這可能需要在Eclipse中進行配置,而不是其用戶,但這種情況始終發生 – MadProgrammer

回答

0

這裏提供的指導解決問題的方法非常有幫助 - 謝謝大家。我測試了一個導出的JAR的內容;我使用了Kishan建議的診斷代碼來確定我的代碼是否可以「看見」圖像。我相信這可能與Eclipse的工作/刷新方式有關,如果我在文件系統中移動圖像而不是Eclipse導入功能。 最後,爲了讓它起作用,我做了以下更改: 我創建了一個新項目和兩個子包 - 一個用於「資源」,一個用於我的代碼類。然後,我右鍵單擊>導入Eclipse中的資源包以獲取圖像。

在我的代碼中唯一改變的是.... getResourceAsStream(「/ resources/strawberry.jpg」);

0

可能性3處理IMAGE:

您可以檢查您獲取的存在或不是資源。它未找到資源,那麼你可以創建JLabel用其他文字也...

JLabel label1 ; 
URL imageUrl = IconTest.class.getClassLoader().getResource("strawberry.jpg"); 
if (imageUrl != null) { 
    label1 = new JLabel(new ImageIcon(imageUrl)); 
} else { 
    label1 = new JLabel("Alternative text"); 
} 
+0

ImageIO可以直接到URL,不需要加載流,你不關閉... – MadProgrammer

+0

@Krishan - 這非常有幫助 - 謝謝。我設法通過在一個新項目中創建兩個包來實現它 - 一個用於資源,一個用於我的代碼類。然後,我右鍵單擊>導入Eclipse中的資源包以獲取圖像。在我的代碼中唯一改變的是.... getResourceAsStream(「/ resources/strawberry.jpg」); – Synapse

0

放在哪裏你有源文件中的圖像,因爲它指向源目錄

InputStream resourceAsStream = IconTest.class.getResourceAsStream("strawberry.jpg"); 

,然後生成可運行jar文件,然後右鍵單擊罐子上真作爲運行Java平臺的二進制

+0

我可能是錯的,但我沒有東西eclipse喜歡弧目錄中的資源,並沒有包含在src目錄中的文件,我認爲他們需要在資源目錄 – MadProgrammer

+0

http://stackoverflow.com/a/2195501/1225526這個不好的幫助你,我認爲 – Karthigeyan

0
InputStream resourceAsStream = IconTest.class.getResourceAsStream("/strawberry.jpg") 

應該從 「/」 開始。同時檢查罐子是否有圖像。只需解壓縮它,並檢查圖像是否實際添加。

相關問題