Jar不会显示图像

时间:2016-03-21 10:31:57

标签: java swing embedded-resource

我的图像图标有问题。我知道以前曾经问过这个问题,但我无法弄清楚如何解决这个问题,因为我觉得我的问题不同了。当我用eclipse启动app时,一切正常。但当我制作可运行的jar时,它不会显示图像。

我的ImagesHolder类的一些代码:

package Clicker;

import javax.swing.ImageIcon;

public class ImagesHolder {

       final public ImageIcon AccessoriesIcon = new ImageIcon("Images/Part_Accessories.png");
       final public ImageIcon BodyIcon = new ImageIcon("Images/Part_Body.png");
       final public ImageIcon BrakesIcon = new ImageIcon("Images/Part_Brakes.png");
       final public ImageIcon CoolingIcon = new ImageIcon("Images/Part_Cooling.png");
       final public ImageIcon ElectronicsIcon = new ImageIcon("Images/Part_Electronics.png");
       final public ImageIcon EngineIcon = new ImageIcon("Images/Part_Engine.png");
       final public ImageIcon ExaustIcon = new ImageIcon("Images/Part_Exaust.png");
       final public ImageIcon FuelIcon = new ImageIcon("Images/Part_Fuel.png");
       final public ImageIcon InteriorIcon = new ImageIcon("Images/Part_Interior.png");
       final public ImageIcon SteeringIcon = new ImageIcon("Images/Part_Steering.png");
       final public ImageIcon SuspensionIcon = new ImageIcon("Images/Part_Suspension.png");
       final public ImageIcon TransmissionIcon = new ImageIcon("Images/Part_Transmission.png");
       final public ImageIcon TiresIcon = new ImageIcon("Images/Part_Tires.png");

如果我将图像设为URL,我就无法重置图像图标,就像这里一样(我有标签,我想更改标签图标)

标签示例:

   public JLabel AccessoriesLVL1Label = new JLabel(ImagesHolder.LockedIcon);
   AccessoriesLVL1Label.setHorizontalTextPosition(JLabel.CENTER);
        AccessoriesLVL1Label.setVerticalTextPosition(JLabel.BOTTOM);
        AccessoriesLVL1Label.setText("<html>Accessories LVL 1<br>" + "Count: " + Part.parts[1]);

并改变:

if(CarMain.main[5] >=1){
            jbtnSellAccessoriesLv1.setEnabled(true);      
            Labels.AccessoriesLVL1Label.setIcon(ImagesHolder.AccessoriesIcon);         
        }

编辑: 如果我这样:

final public ImageIcon MoneyIcon = new ImageIcon("Images/Money.png"); 

制作:

URL MoneyIcon = ImagesHolder.class.getResource("/Money.png");

我在这一行得到错误:

Labels.MoneyLabel.setIcon(ImagesHolder.MoneyIcon);

错误:

The method setIcon(Icon) in the type JLabel is not applicable for the arguments (URL)

2 个答案:

答案 0 :(得分:3)

从jar文件中获取图像有另一种选择:

理想的方法是在项目根目录下有一个资源目录,并将其包含在源代码目录列表中。这将导致所有图像被复制到JAR中。如果你在那里创建一个子目录,资源/图像,那么你最终会得到一个有图像目录的JAR。您可以通过类加载器访问这些图像:

classloader.getResourceAsStream("/image/image1.jpg");

或,

classloader.getResource("/image/image2.jpg");

详细示例请参阅this链接。

答案 1 :(得分:2)

好吧,总结以前给出的答案: 我猜一个潜在的解决方案是使用classloader作为Dark Knight提出的。此外,您只需在设置之前创建一个新的ImageIcon

URL MoneyIcon = ImagesHolder.class.getResource("/Money.png");
Labels.MoneyLabel.setIcon(new ImagesIcon(ImagesHolder.MoneyIcon));

因为如果再次查看代码,我认为它有点不合理。我的意思是你要设置一个ImageIcon,但最后一件事是一个URL对象。这必须抛出错误应该是有道理的。然而正如Andrew Thompson已经说过:你可以从上面显示/解释的那个URL构建一个ImageIcon

既然你也解释过你的目录有问题(从源头到编译结构)我想添加一些链接以便进一步阅读:如果你只是使用&#39; plain&#39; Java(没有构建工具)也许这个链接可以提供帮助:Copying data files upon build in Java/Eclipse。它主要是为Eclipse编写的,但我猜大多数其他IDE应该提供类似的选项。

从我目前的项目中,我还建议使用像Maven这样的工具。对于较小的项目,它可能略高于顶部,但它需要大量的工作(例如库处理,处理图像等资源)。这些只是可能对您有用的一些部分。如果您对此感兴趣,我猜您会在Web上找到许多有用的资源,因为Maven(或Ant和Gradle等其他工具)非常常用。