2012-06-04 31 views
2

我目前正在阅读一本关于java的书,并且我正在研究swing图形用户界面组件。当我这样做,我偶然发现了一个代码示例,在这里笔者被设置在一个JButton的图像与一个非常不寻常的方式,如下图所示:关于JButton和ImageIcon

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

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

回答

4

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

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

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

你会想通过阅读所有这些方法的javadoc自己想出这一切。

+0

您好,感谢您的回答,我已经理解了上面的代码做了什么,至少在某种意义上,但是我希望有人比我更好地向我解释这一点,因为我知道我是否得到了它从一开始就是正确的。再次感谢您的澄清答复。 – NlightNFotis

+1

我意识到我没有真正回答你的疑惑和幻想:没有更简单或更简单的方法来做到这一点(但我不明白它如何可能更简单),而且它并不是一种不寻常的方式:那是典型的这样做的方式。 –

2

Class#getResource(String)从类路径返回资源的URL。这是加载存储在应用程序JAR文件中的资源的一种简便方法。如果图像位于硬盘的地方,您可以使用加载:

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

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

甚至更​​容易,因为ImageIcon有一个构造器是一个文件名:

new ImageIcon("/path/to/the/image"); 
+0

*“JButton上的图像”*暗示是嵌入式资源。 'File'对象不适合访问Jar中的资源。 –

+0

这就是为什么我特别写了_IF图像位于HDD_上。在Java中从类路径中打开文件(资源)过于复杂,对初学者来说很难理解(我花了一些时间),我只是想简化案例,通过展示它如何与外部文件一起工作 - 在我看来 - 更容易理解。 – npe

+0

我认为使用'toURI()。toURL()'是你的文件名包含需要为URL转义的字符的情况。这种情况很少。或者你能解释一下吗? – npe

2

Java的秋千可以克服复杂的真快,我认为他实际上使用这种简单的代码。

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

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