嗨,我还是编程新手,我正在创建一个包含大量图像的gui应用程序。我想把我的工作发送给同事,但程序无法工作,因为图像将有一个不同的文件目录:
labelPic.setIcon(new ImageIcon("C:\Users\Jordan\eclipseworkspace\GuiProject\src\images\loadingPic.gif"));
我该如何更改目录,以便其他人在我发送程序时可以打开和编辑程序?
最终,您将把应用程序打包到一个jar
文件中。就像你的类文件是应用程序的基本组成部分,如果没有它们,安装就会中断一样,你的图标也是如此。
因此,显而易见的答案是:将图像存储在存储类文件的同一个位置,并使用相同的机制加载它们。即使它们是一个jar(也就是说,它们根本不是一个文件,你根本不能使用该构造函数-根本,这只适用于文件,目的是在这里甚至没有文件,目的就是在jar中有一个条目(。
幸运的是,这很容易,但一两件事取决于你如何构建/开发应用程序。无论你使用什么构建,你的代码都应该是这样的:
labelPic.setIcon(TheClassThisCodeIsIn.class.getResource("/images/loadingPic.gif"))
唯一的问题是:你需要对你的构建过程做些什么才能让它发挥作用。从这条路径的风格来看,我很确定答案是:没有什么,这会很好地工作,无论是在eclipse内部直接运行它时,还是在告诉eclipse将它打包到一个罐子中时。
那条线的作用
Foo.class
是有效的java,但有点奇怪。意思是:为命名类获取一个java.lang.Class<?>
引用。您想要自己类的引用,正如我们将要问的那样,是从加载资源的位置加载资源。我们将把这些图像放在这个代码的类文件所在的位置,所以这就是为什么我们向您自己的类实例询问这些数据。
getResource
返回一个URL。ImageIcon知道该怎么处理它,你不必知道。
/images/loadingPic.gif
然后指定资源名称这不是文件名。因此,前向斜杠(正如我所说,如果你最终在windows上运行它,而不是文件路径或java资源名,那也没关系(。因为我们以斜杠开头,所以加载程序会查看YourClass.class所在的"根"。例如,如果YourClass.class在一个jar文件中,它会在jar的"根"中查找名为"images"的文件夹,然后从那里找到名为"loadingPic.gif"的条目。