代码之家  ›  专栏  ›  技术社区  ›  MsCrelix

Jar不会显示图像

  •  1
  • MsCrelix  · 技术社区  · 9 年前

    我对图像图标有问题。我知道以前有人问过这个问题,但我不知道如何解决这个问题,因为我认为我的问题不同。当我用eclipse启动应用程序时,一切都正常。但当我让它运行时,它不会显示图像。

    我的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 回复  |  直到 9 年前
        1
  •  3
  •   Community CDub    7 年前

    有一种方法可以从jar文件获取图像:

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

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

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

    参考 this 详细示例的链接。

        2
  •  2
  •   Community CDub    7 年前

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

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

    因为如果你再看一遍你的代码,我想这是有道理的,因为它不起作用。我是说你想设定一个 图像图标 但你最后拥有的是 URL 对象这一定会引发错误,这是有道理的。然而,正如安德鲁·汤普森(Andrew Thompson)所说:你可以构建一个 图像图标 如上面显示/解释的。

    既然你还解释了你的目录有问题(从源代码到编译的结构),我想添加一些链接供进一步阅读:如果你只使用“普通”Java(没有构建工具),这个链接可能会有所帮助: Copying data files upon build in Java/Eclipse 它主要是为Eclipse编写的,但我想大多数其他IDE都应该提供类似的选项。

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