簡體   English   中英

從jar文件加載圖像

[英]Load images from a jar file

我有一個從Netbeans IDE完美運行的應用程序,但是當從dist目錄中的jar文件運行時,不會加載必要的圖像。

我花了1個半天閱讀這個和其他論壇,試圖找到答案,但我無法讓jar圖像工作。

在這里,他是我的代碼摘錄:

String str = t.getText() + "100.gif";
Image img = null;

if (t != HIDDEN)
{
    ClassLoader cldr = Terrain.class.getClassLoader();
    URL url = cldr.getResource("fantasyhexwar/Images/" + str);

    if (url == null)
        JOptionPane.showMessageDialog(null, "no good");

    img = ImageIO.read(url);
    t.setImage(img);
}

我嘗試了很多相對路徑的組合,包括“images /”,“/ images /”等。圖像在jar文件中:

 fantasyhexwar/Images/plains100.gif
 fantasyhexwar/Images/quarry60.gif
 fantasyhexwar/Images/ram80.gif
 fantasyhexwar/Images/save map40.gif
 fantasyhexwar/Images/scout80.gif
 fantasyhexwar/Images/settler80.gif
 fantasyhexwar/Images/ship80.gif

等等...

我知道我遺漏了一些基本的東西,但我不確定是什么。 我懷疑它與清單文件或類路徑有關。

希望有人可以指出我正確的方向......

編輯:問題似乎是這樣

URL url = Terrain.class.getResource("/fantasyhexwar/Images/" + str);

返回null。 圖像肯定在JAR中,在絕望中我也嘗試了所有可能的相對路徑,代碼如下:

ClassLoader cldr = Terrain.class.getClassLoader();
URL url = Terrain.class.getResource("/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("/fantasyhexwar/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("fantasyhexwar/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("/Images/" + str);
if (url == null)
    url = cldr.getResource("Images/" + str);
if (url == null)
    url = cldr.getResource("/" + str);
if (url == null)
    url = cldr.getResource(str);
if (url == null)
    JOptionPane.showMessageDialog(null, "no good");

但直接從JAR執行時它都不起作用......

當我嘗試從命令行運行時,我得到:

java -cp .; FantasyHexWar.jar FantasyHexWarApp

Exception in thread "main" java.lang.NoClassDefFoundError: FantasyHexWarApp
Caused by: java.lang.ClassNotFoundException: FantasyHexWarApp
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: FantasyHexWarApp.  Program will exit.

我的文件名有點粗心。 例如,一個文件名為“save map.png”,但應用程序正在尋找“Save Map.png”。

從驅動器加載文件時這很好用,但是當轉換成URL並直接從jar加載時,它就完全不同了。

因此,jar中的資源文件名似乎區分大小寫

我有同樣的問題。 解決方案來找我讀取有關getToolkit()函數的意見。 在我的情況下,我正在構建一個桌面應用程序,函數getToolkit()對我來說是不可用的。 相反,我需要使用此代碼:

Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(path));

該程序現在可以在Netbeans環境中運行。

閱讀Swing教程中有關如何使用圖標的部分, 獲取有關其工作原理的詳細說明。

使用此選項可顯示.jar文件中的圖像

ClassLoader.getSystemResource("images/Springz3.png");

如果圖像在jar文件中,請在fantasyhexwar / Images /。*下,

Image image = getToolkit().getImage(ClassLoader.getSystemResource("fantasyhexwar/Images/plains100.gif"));

將工作。

可能值得一試。


Image theImage = getToolkit().getImage(getClass().getResource("/path/to/image"))

我不認為它與從jar加載圖像有任何關系。 你得到的例外說: -

java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: FantasyHexWarApp. Program will exit.

這意味着,jar中沒有FantasyHexWarApp主類。 修復它,它應該工作得很好。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM