new ImageIcon("./image/risk.jpg")
图像没有出现在 jar 文件中
不合逻辑。图像文件是否在那个 jar 中是无关紧要的; 这不适用于 jar 文件,句号。
ImageIcon 构造函数接受一个文件参数。 字面意义上的是文件:它指的是实际磁盘上文件的路径。你用.,意思是:当前工作目录,因此失去了稳定应用程序的所有机会;当前工作目录是 JVM 启动的任何目录,因此不可靠。即使你挥动魔杖解决了这个问题,下一个更紧迫的问题是在任何地方都没有 risk.jpg 文件 - 它是 jar 文件中的一个条目,它本身并不是文件。只是罐子里的一个条目。
解决方案
解决方法是不使用那个构造函数,而是依赖java的资源检索系统:
class MyClass {
public void foo() {
URL url = MyClass.class.getResource("risk.jpg");
}
}
这将为您提供一个表示资源的 URL(可以是实际文件,但也可以是磁盘、Web、数据库中的条目,动态生成 - 无论类加载器提供什么。如果您没有t 与自定义类加载器混淆,它将始终是磁盘上的文件或 jar 文件中的条目),这也可以传递给 ImageIcon(它还有一个接受 URL 的构造函数)。
然后它会查找一个名为 risk.jpg 的文件,该文件与 MyClass.class 所在的位置相同。无论是在磁盘上的某个地方,还是在一个 jar 文件中(所以如果它在 package com.foo; 中,那么您有一个带有条目 com/foo/MyClass.class 的 jar 文件,然后该命令将在同一个 jar 文件中找到条目 com/foo/risk.jpg。您可以使用前缀斜杠从 jar 的根目录开始:MyClass.class.getResource("/image/risk.jpg")(注意,没有前导点!)将在该 jar 中查找条目 image/risk.jpg。
太棒了!呃,但是,那个图片应该在罐子里吧?
是的,此代码将确保您查看类文件所在的相同位置,这很好,但您仍需要确保正确设置构建。 “让 eclipse 制作一个 jar”不是推荐的构建解决方案;花一些时间学习 maven 或 gradle。但是,如果您坚持,eclipse 应该只包含它们,但是将 jpg 放在源目录中,就在您的 java 文件旁边(eclipse 知道要复制非 java 文件,并且要编译 java 文件)。
换句话说,如果你坚持使用 eclipse 的 'make a jar' 作为构建工具,image 必须移动到src。
或者,设置一个基本的maven项目,其中源在src/main/java,图像文件等在src/main/resources,使用eclipse中的maven插件读取基于maven的项目,这也可以,如果您出于某种原因希望这些目录完全分开。