罐子不会显示图像

Jar won't display Images

我对图像图标有疑问。我知道之前有人问过这个问题,但我不知道如何解决这个问题,因为我认为我的问题是不同的。当我用 Eclipse 启动应用程序时,一切正常。但是当我把它做成可运行的jar时,它不会显示图像。

我的 ImagesHolder 的一些代码 Class :

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)

有一个从 jar 文件获取图像的替代方法:

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

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

或者,

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

参考 this link 了解详细示例。

好吧,总结一下之前给出的答案: 我想一个潜在的解决方案是使用 classloader 作为黑暗骑士提议的。此外,您只需要在设置之前创建一个新的 ImageIcon

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

因为如果您再次查看您的代码,我想它是行不通的。我的意思是您想设置一个 ImageIcon,但您最后拥有的是一个 URL 对象。这必须抛出一个错误应该是有道理的。然而正如 Andrew Thompson 已经说过的:您可以从上面的 displayed/explained 中的 URL 构建一个 ImageIcon

并且由于您还解释了目录存在问题(从源代码到编译的结构)我想添加一些 links 以供进一步阅读:如果您只使用 'plain' Java(没有构建工具)也许这个 link 可以帮助:Copying data files upon build in Java/Eclipse。它主要是为 Eclipse 编写的,但我想大多数其他 IDE 应该提供类似的选项。

从我目前的项目来看,我还可以推荐使用像 Maven 这样的工具。对于较小的项目,它可能有点过头了,但它需要做很多工作(例如库处理、图像等资源的处理等)。这些只是一些可能对您有用的部分。如果您对此感兴趣,我想您会在网络上找到很多有用的资源,因为 Maven(或其他工具,如 Ant 和 Gradle)非常常用。