【问题标题】:Jar won't display Images罐子不会显示图像
【发布时间】:2016-03-21 10:31:57
【问题描述】:

我对图像图标有疑问。我知道以前有人问过这个问题,但我不知道如何解决这个问题,因为我认为我的问题不同。当我使用 Eclipse 启动应用程序时,一切正常。但是当我把它做成可运行的 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)

【问题讨论】:

  • 首先,你有没有检查过它们在罐子里吗?以防万一……
  • @user3272243 是的,我以 zip 格式打开 jar 文件,里面有所有图片。但它们是主要的,而不是图像文件夹。我尝试更改图像位置(在代码中,如果图像在主文件夹中,则可以工作),但仍然没有显示任何图像
  • 如果您将它们移动到罐子内,就好像它是一个“正确位置”的拉链一样,它们会起作用吗?也尝试使用绝对路线将它们放置在该位置,看看罐子是否可以以这种方式丢弃,如果罐子真的不起作用或者它是否对您有问题。
  • @user3272243 对不起,我的英语不太好,我听不懂你的意思。也许你可以请解释一下,不知何故不同?这是图像,图像在 jar 文件中:imgur.com/LvBcvYN
  • Check this answer。它会帮助你。

标签: java swing embedded-resource


【解决方案1】:

还有一种从 jar 文件中获取图像的方法:

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

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

或者,

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

详细示例请参考this链接。

【讨论】:

  • 请查看我的编辑。
  • “还有一种从 jar 文件中获取图像的替代方法:..getResource 这听起来像是通过 URL 访问资源之外的另一种方法。实际上我可以想到一个“替代方案”,但细节太可怕了。没有。getResource(或getResourceAsStream)只是从 Jar 文件中获取资源的方式。其他任何东西都是“替代品”。
  • @MsCrelix 请确保资源目录下有图片。
  • “请查看我的编辑。” 您确实需要查阅 JavaDocs 以了解正在使用的类和方法。没有文档的编程就像试图用一只手被绑在背后进行战斗。 注意ImageIcon构造函数之一将接受URL
【解决方案2】:

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

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

因为如果你再看一遍你的代码,我想这有点道理但它不起作用。我的意思是你想设置一个ImageIcon,但你最后拥有的是一个URL 对象。这必须引发错误应该是有道理的。然而,正如 Andrew Thompson 已经说过的那样:您可以从该 URL 构造一个ImageIcon,如上所示/解释。

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

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

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2014-08-06
    • 2018-04-17
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多