7

当我创建 ImageIcon 类对象时,我使用以下代码:

iconX = new ImageIcon (getClass().getResource("imageX.png"))

当 .png 位于类的同一文件夹中时,上述代码在小程序或桌面应用程序中都能正常工作。

问题是:如何避免NullPointerException.Png 在另一个文件夹中?或者,当图像位于ImageIcon与类不同的位置时,如何将图像加载到对象中?

我不明白这种方法是如何工作的,如果有人可以帮助我,我将不胜感激。谢谢!!

4

3 回答 3

4

看看这个 -Class#getResource(java.lang.String)

请单击上面的链接并阅读文档并按照以了解发生了什么。

它说 -

如果名称以“/”开头,则资源的绝对名称是名称中“/”后面的部分。

否则,绝对名称的格式如下:

     modified_package_name/name

其中 modified_pa​​ckage_name 是此对象的包名称,其中 '/' 替换为 '.'。

所以,如果这个对象(你调用的地方getResource)在包中/pkg1/意味着 pkg1 就在类路径的根目录下)并且你使用了“imageX.png”,那么结果将pkg1/imageX.png是正确的,因为那是图像所在的位置。

但是,如果我们将资源 (imageX.png) 移动到某个其他包/pkg2并且您以相同的方式调用该方法,那么结果仍然是pkg1/imageX.png,但这次它会不正确,因为资源实际上位于/pkg2. 那就是您最终使用NPE的时候。

最好从类路径的根目录开始明确指定资源的完整路径。(例如“/pkg/imageX.png”)。

希望这可以帮助。

于 2012-08-24T05:21:33.970 回答
2

只需提供资源的路径。

因此,如果您将图像放在 Jar 中的“/resources/images”中,您只需使用

iconX = new ImageIcon(getClass().getResource("/resources/images/imageX.png"))

本质上,您要说的是,类加载器,请在您的类路径中搜索以下资源。

于 2012-08-24T05:04:35.643 回答
1

如果图像是内部的(你想要一个相对于你的项目的位置,或者可能打包到你的 jar 中),按照疯狂的程序员所说的去做:

iconX = new ImageIcon(getClass().getResource("/path/imageX.png"))

路径是相对的,因此 path/ 将是与您的项目位于同一文件夹中的文件夹(或打包到您的 jar 中)。

如果您想要外部图像,只需将路径传递给 ImageIcon 构造函数(例如“C:/.../file.png”)。不建议这样做,因为最好将其用作资源。

有关 ImageIcon 构造函数的更多信息,请参见此处。有关加载类资源的更多信息,请参见此处(Javadoc 链接)

于 2012-08-24T05:17:06.287 回答