javafx.scene.image.Image("flower.png") 在哪里寻找flower.png?

Posted

技术标签:

【中文标题】javafx.scene.image.Image("flower.png") 在哪里寻找flower.png?【英文标题】:Where does javafx.scene.image.Image("flower.png") look for flower.png? 【发布时间】:2012-05-21 11:16:39 【问题描述】:

想知道JavaFX Image构造函数的相对路径解析算法是干什么用的:

    独立应用。 浏览器部署的应用程序。 Webstart 部署的应用程序。

如果算法可能会在多个位置查找,我想知道对于上述每个部署场景它们是什么。

如果将应用放入 jar 时,独立应用的行为会有所不同,我也想知道。

【问题讨论】:

【参考方案1】:

然后用户提供到new Image(String url) 的相对路径,它将相对于应用程序的工作目录又名System.getProperty("user.dir")

    对于独立应用程序,它是您启动应用程序的文件夹 对于从命令行 (javaws myfxapp.jnlp) 运行的 web-start 应用程序,它的工作方式与独立应用程序相同 对于从浏览器加载的插件启动或 webstart 应用程序,您无法可靠地确定工作目录的位置。这取决于浏览器,甚至取决于为该浏览器安装的插件。

所以大体方向是:对于独立应用程序,使用 url 与在 new File(String url) 中使用它的方式相同。对于 jnlp/plugin 使用带有协议的完整 url 或 Class.getResource() 方法。

更新:请注意,此行为将在 2.2 中得到澄清和更改。见http://javafx-jira.kenai.com/browse/RT-18291

以下评论来自 RT-18291,概述了 2.2 的预期更改:

Martin Sladecek 添加了评论 - 2012 年 5 月 15 日上午 10:53 在与 Richard Bair 讨论后,我们决定更改路径的当前(未记录)行为。目前,它们被视为 user.dir 相对。所有路径,无论是否带有前导斜杠,现在都将被解析为相对于类路径,这将与 CSS 一致,并且更符合用户的期望。 对于 user.dir 相对路径,仍然可以使用“file:”URL。

【讨论】:

抱歉,刚刚注意到您更新了一个问题。我稍后会调查。 谢谢谢尔盖。抱歉,我想了解的所有场景的原始措辞都不清楚。 感谢谢尔盖的详细更新。我提出了jira 来改进 API 的文档并将您的答案包含在 Jira cmets 中。 我尝试了一切,但无法找到该文件。他们是否真的认为,虽然地球上的所有其他应用程序都在查看user.dir(或$PWD),但这种新行为“符合用户的期望”?无论如何,非常感谢您解决这个问题。不知道使用最新的 javafx 引入了一些重大更改。 新方法实际上更不容易出错。通过这种方式,您可以将资产包含在项目中,并主要像指定包一样指定路径(除了斜线而不是点)。以前,您必须在用户首次运行资产时或之前以某种方式将资产解压缩到用户的目录中,这使得即使不是不可能,至少也很难将您的资产部署为单个 JAR(您需要自动提取,并且如果你不能自动提取就没有办法)。 [待续。]【参考方案2】:
    搜索与您的 .java 文件相关的类文件(类名称 getClass().getName().toString())所在的目录,将您的图像复制并粘贴到那里 Image image=new Image(getClass().getResourceAsStream("yourImageName.jpg")); 是必须的。

在 NetBeans 中,类所在的目录 NetBeansProjects/JavaFXProjectName/build/classes/packageName/

【讨论】:

【参考方案3】:

如果您使用的是getClass().getResourceAsStream(),则答案是“/”,即您的 jar 文件的根目录(在其中)。不是 user.dir 也不是包的托管位置

【讨论】:

抱歉,没有。运行下一个代码:System.setProperty("user.dir", "c:"); root.getChildren().add(new ImageView(new Image("brd.jpg")));,你将有下一个异常:java.io.FileNotFoundException: c:\brd.jpg 是的,没错,我的错。我习惯使用 getClass().getResourceAsStream() 来搜索包而不是你所说的 user.dir 请更新您的答案,说明它是getClass().getResourceAsStream() 的情况,以避免混淆读者。

以上是关于javafx.scene.image.Image("flower.png") 在哪里寻找flower.png?的主要内容,如果未能解决你的问题,请参考以下文章