2

我目前正在看一本关于java的书,我目前正在研究swing图形用户界面组件。当我这样做的时候,我偶然发现了一个代码示例,作者正在以一种非常不寻常的方式在 JButton 上设置图像,如下所示:

Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) );

为了使上述工作正常,您需要将图像与 .class 文件放在同一文件夹中。有人可以向我解释他为什么要使用这个特定的代码(据我所知,它必须是反射代码,但话又说回来,我对这个不是特别确定),如果我有一种方法可以做到同样的事情,没有把事情弄得像他那样复杂?

4

3 回答 3

4

只有当你不理解它们时,事情才会变得复杂。一旦你理解了上面的代码是做什么的,它就会变得非常简单。

getClass()返回当前对象的 Class 对象 ( this)。getResource()使用上面的相对路径调用,在类路径中查找名为 bug1.gif 的文件,并在与被调用的 Class 对象相同的包中。因此它会在与包含上述代码的类相同的包中查找 bug1.gif。getResource()返回一个 URL。构造函数将ImageIconURL 作为参数,从该 URL 加载图像字节,并从这些字节构造一个 ImageIcon。

所以整个事情只是从类路径中可用的文件创建一个 ImageIcon,与调用此代码的类在同一个包中。这是有道理的:您将给定类使用的图像与该类放在同一个包中,然后发布一个包含类和应用程序图像的 jar。

通过阅读所有这些方法的 javadoc,您会自己弄清楚这一切。

于 2012-06-04T19:02:14.087 回答
2

Class#getResource(String)从类路径返回资源的 URL。这是加载存储在应用程序 JAR 文件中的资源的一种便捷方式。如果图像位于 HDD 上的某个位置,您可以使用以下命令加载它:

new ImageIcon(new File("/path/to/the/image").toURI().toURL());

它创建File对象,并将其路径作为 URL(看起来像file:///path/to/the/image)。

或者更简单,就像ImageIcon使用文件名的构造函数一样:

new ImageIcon("/path/to/the/image");
于 2012-06-04T18:59:24.910 回答
2

Java 的 Swing 可以非常快速地克服复杂性,我认为他实际上是为了简单而使用此代码。

如果图像路径是相对路径(示例中的路径是),则图像必须位于与程序的已编译字节码 .class 文件相同的位置。如果图像在其他任何地方,您的程序根本找不到它。

像这样的相对路径非常有用,尤其是当您想将完成的项目编译成 JAR 文件时。您的图像将与您的所有 .CLASS 文件一起包含在 JAR 中。您将能够下载您的编译程序并运行它,并且您的图像将在您的 GUI 中就如您所期望的那样。

于 2012-06-04T18:59:25.413 回答