在Java FX中定义图像的相对路径

8

我知道这个问题已经被问了很多次,我已经广泛搜索了解决这个简单问题的方法。我正在尝试按照Oracle网站上的简单javaFX组件教程操作。我可以通过以下方式定义一个图像:

Image img = new Image("images/portal.png", 50, 50, true, true);

当图像位于“src”文件夹内的文件夹中时,它可以正常工作,但是我正在尝试在图像文件夹位于“src”文件夹之外时找到它,就像这样:

project_root/
 |---src/
      |---Main.java
 |---images/
      |---portal.png    

我应该如何使这个工作呢?我一直收到“无效的URL或未找到资源”的错误信息。我尝试使用绝对路径,使用“..”放在路径前面,还尝试过“HS-Graph/images/portal.png”以及其中的所有内容,但仍然不行 :( 谢谢!


构建一个URL。使用url.toString()保存它。然后使用new Image(String)。 - edharned
我不确定你的意思,为什么会有任何区别呢?这仍然会导致一个与我的情况中相同文本的字符串。 - Zorobay
使用以下代码可以创建一个文件对象:File file = new File("portal.png"); 如果文件存在,你可以使用afile.getAbsolutePath()获取文件路径,或者使用file.toURI()获取URI。这对你有帮助吗? - edharned
好吧,它不起作用:(。file.exists()是false。它找不到我的文件。肯定有一种简单的方法来设置相对路径,这些路径在您的src文件夹之外!我的意思是,在slick中它可以工作!感谢您的帮助... - Zorobay
你找不到文件是你的任务。阅读Java.io.File的JavaDoc。你只在当前目录中查找。你需要遍历文件系统来查找根目录,或者与你的环境相关的任何内容。你可以在这里搜索或谷歌文件遍历等,以获得如何执行此操作的一些想法。如果文件在你的文件系统中,那么你可以找到它。 - edharned
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
21

我将回答自己的问题,因为我实际上找到了解决方案!我的解决方案是在指定路径时使用 "file:" 前缀。所以:

Image img = new Image("file:images/portal.png");

当图片文件位于我的src文件夹之外时,它可以完美地工作!


这个编程示例不起作用。我添加了前缀文件,但仍然无法工作。 - Ng Sharma
你使用的是Windows吗?我刚刚又试了一下,它完全正常。你把图像文件夹放在项目文件夹外面了吗? - Zorobay
好的,我会尝试。谢谢回复。 - Ng Sharma
奇怪。我做了这个,现在控制台中出现一个疯狂的错误,不停地闪烁。实际上,我甚至无法复制它,因为它一直在闪烁。 - Riley Fitzpatrick
如果您在.fxml文件中使用url="file:resources/iconfinder_heartbeat_1930261.png"而不是url="@../../../../resources/iconfinder_heartbeat_1930261.png",也可以正常工作。 - Juan

4
我认为你遇到问题是因为“Images”文件夹在你的项目范围之外。你可以考虑改变项目结构。 例如:
->src
|-->main
    |--->java
          |-->(default package)
    |--->resources
          |-->images

那么你应该能够通过路径./src/main/resources/images/portal.png访问到你的图片。


好吧,这并不是在我的项目之外,它就在项目文件夹(HS-Graph)下面。我知道我已经使用 Slick 编写了一个游戏,在那里我把图像文件夹放在这里,它可以工作 :/ - Zorobay
1
但是该文件夹不是类路径的一部分,因此在运行时无法找到它。 - tomsontom
那么你的意思是没有办法按照我想要的方式来做吗?我必须把我的图像、音频、视频和其他内容放在我的src文件夹里吗? - Zorobay

2

让我试着这样说; 如果你想使用在不同目录中找到的图像,最好指定它的相对路径。例如,如果我正在寻找我的ImageFile上的门户图像,我将按照以下方式进行:

Image img = new Image("file:images/portal.png");

2
不应使用绝对路径。如果他想要分发程序怎么办?用户可能不会将其存储在 C 驱动器上,而且肯定不会有相同的机器用户名。最好通过 System.getProperty("user.home") 访问用户文件夹,但即使如此,程序也必须将所有资源存储在那里(这并不罕见,但限制并不总是首选)。 - Dioxin
我尝试了这个建议 'Image img = new Image("file:images/portal.png");' 但它对我没有起作用,所以我使用了那个。 - eli
1
他的图片在项目文件夹中,而你的示例显示该图片位于桌面上(而不是项目文件夹中)。将你的图片放入项目中(在名为“images”的文件夹下),然后再试一次。他的问题是关于图片不在“ProjectName/src”中,但他仍然有它在“ProjectName/images”中。 - Dioxin
它需要在ProjectName/images中。file:部分告诉程序该路径是项目内的文件。然后跟着images/...,这告诉我们它在图像文件夹中。问题是关于加载不在src文件夹(源文件夹)中的图像。如果您有25个声望,我可以邀请您进行聊天以进一步解释。编辑一些帖子(每次获得+2声望),修复此答案,使其合理化投票(不要使用绝对路径)。 - Dioxin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,