setIconImage仅在eclipse中有效,在导出为runnable jar文件时不起作用

我已经搜索了一段时间来修复此问题。 我的工作区中有一个项目文件夹(该文件夹基本上是我的根目录),其中有一个名为icon.gif的文件。 在我的计划中,我有以下内容:

package com.mgflow58.Main; import javax.swing.ImageIcon; import javax.swing.JFrame; public class Game { public static void main(String[] args) { JFrame window = new JFrame("Guppy's Adventure"); window.add(new GamePanel()); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setResizable(false); window.pack(); window.setLocationRelativeTo(null); window.setVisible(true); window.setIconImage(new ImageIcon("icon.gif").getImage()); } } 

当我运行它时,图标在eclipse中工作正常,但导出的jar文件不会像在eclipse中那样显示图标。 知道为什么吗? 我疯狂地试图解决这个问题。

jar文件包含其正确文件夹中所需的所有图像文件。

有问题… ImageIcon(String)正在寻找磁盘上的命名文件,如JavaDocs所描述的……

public ImageIcon(String filename)

从指定的文件创建ImageIcon。 将使用MediaTracker预先加载图像以监控图像的加载状态。 指定的String可以是文件名或文件路径。 指定路径时,请使用Internet标准正斜杠(“/”)作为分隔符。 (该字符串将转换为URL,因此正斜杠适用于所有系统。)例如,指定:

new ImageIcon("images/myImage.gif")

描述初始化为文件名字符串。

参数:
filename – 指定文件名或路径的String

资源不再驻留在磁盘上,但未嵌入到Jar文件中,因此无法再使用基于File的方法访问它们。

相反,你需要使用像Class#getResource这样的东西,例如……

 window.setIconImage(new ImageIcon(Game.class.getResource("icon.gif")).getImage()); 

话虽如此,我还建议在ImageIcon使用ImageIO有很多原因,但主要是因为如果由于某种原因无法加载资源,它会实际抛出exception,而不是静默失败…

请查看阅读/加载图像以获取更多详细信息