java - 无法在不使用文件 : Prefix 的情况下构造具有相对文件路径的图像对象

标签 java image javafx javafx-8 illegalargumentexception

我一直在尝试创建这样的图像对象:

Image img = new Image("images/jack.png");

Image img = new Image("jack.png");

/jack.png/images/jack.png

我已经使用System.getProperty("user.dir")查找了工作目录,它确实是我放置图像文件的位置。当我使用 file: 前缀时,它确实有效,如下所示:

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

但是,它也应该在不使用它的情况下工作。在教科书中,它是在没有 file: 的情况下完成的。我见过其他没有它也能工作的代码。

在一堆链式异常的末尾,它说:

由以下原因引起:java.lang.IllegalArgumentException:无效的 URL 或未找到资源

我还尝试从 OpenJDK 读取源代码,我可以弄清楚任何事情,因为许多方法都是 native 的,并且从我跟踪的内容来看,我不明白它是如何不起作用的。另外,我可以用同样的方式创建文件,只是无法创建图像。例如,这有效:

File file = new File("fileName.txt");

是什么原因导致此问题,我应该采取什么措施来解决它?

如果重要的话,我正在使用 NetBeans。

最佳答案

请注意,System.getProperty("user.dir") 不会返回工作目录。它返回用户目录。
可以使用 File 构造函数中的相对文件路径指定相对于工作目录的路径。然而,依赖工作目录是不好的做法。从 NetBeans 启动应用程序会导致工作目录成为项目目录,但如果以不同的方式启动,则情况并非如此。

因此,应将应用程序中所需的图像添加到 jar 中。
在这种情况下,您可以通过 Class.getResource() 检索图像 URL 。 (使用 toExternalForm() 转换为 String。)

如果您有一个引用图像文件的 File,则可以使用 File 实例获取 URL:

File file = ...
String urlString = file.toURI().toURL().toExternalForm();

这些 URL 可以与 Image 构造函数一起使用。

<小时/>

请注意

File file = new File("fileName.txt");

创建文件。它仅代表一个文件路径。该文件可能存在也可能不存在。仅调用 File 构造函数不会创建新的构造函数。

关于java - 无法在不使用文件 : Prefix 的情况下构造具有相对文件路径的图像对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609896/

相关文章:

java - Selenium同时控制多个浏览器

android - 某些设备上的 Unity 2D,所有图像都变成粉红色

java - 如何让 NetBeans 在 src 文件夹而不是 dist 文件夹中搜索我的文件?

c++ - 在 C++ Builder 6 中拖放图像

java - 是否可以选择/单击一张图像的多个部分?

java - 当两个场景都显示时,我可以在一个场景中设置另一个场景中的 TextField 值吗?

java - 如何确定字符串列表是否包含 null 或空元素

java - 为什么改变 joinColumn 的顺序,hibernate 返回正确或不正确的查询?

java - 多线程时我需要多少个处理程序

java - 声音和图像文件为空