【问题标题】:JavaFX FXML File takes exactly 1 second to loadJavaFX FXML 文件只需 1 秒即可加载
【发布时间】:2018-12-17 15:43:28
【问题描述】:

我正在使用 JavaFX 构建一个应用程序,并且正在为布局加载 FXML 文件。 一开始,我的所有 .fxml 文件都在我的 java 类路径中。

因为我有点制作游戏引擎,所以我决定将所有内容移到类路径之外,所以我现在有一个如下所示的文件系统:

Folder[javafx]
    editor.fxml
program.jar

这就是我加载 FXML 的方式

FXMLLoader.load(new URL("file:////" + System.getProperty("jdir") + "/javafx/" + name + ".fxml"));

它可能看起来不漂亮,但它可以工作(System.getProperty("jdir") 只是 .jar 在光盘上的位置)。 Java 找到文件,但在每个文件上总是需要一秒钟的时间(FXML 文件大小范围从 1kb 到 6kb)

所以我现在遇到的问题是我的 FXML 加载时间过长。当我在类路径中拥有我的 FXML 时,没有任何延迟。

我希望有人可以帮助我消除这种延迟,或者帮助我从 .jar 加载 FXML(据我所知,您只能通过 Streams 从 jar 加载资源,但 FXMLLoader 不需要流,所以我被卡住了。)

【问题讨论】:

  • 请提供一个minimal reproducible example 来说明问题。
  • FXMLLoader 绝对需要流。我将 FXML 打包为大多数项目的类路径资源。见docs.oracle.com/javase/8/javafx/api/javafx/fxml/…
  • 您可以通过Class.getResource(String)URL 的形式获取资源,并且您可以通过FXMLLoader.load(InputStream) 将流与FXMLLoader 一起使用。除此之外,您需要提供 minimal reproducible example 来演示延迟问题,因为我无法重现该问题。无论我将 FXML 文件放在哪里,应用程序都能快速找到并加载它。

标签: java performance javafx fxml


【解决方案1】:

首先,您可以将 System.getProperty("jdir") 移到外面,因为这样每次加载 fxml 时都会调用它。

所以不是

FXMLLoader.load(new URL("file:////" + System.getProperty("jdir") + "/javafx/" + name + ".fxml"));

执行以下操作:

 String jdirProp = System.getProperty("jdir"); 

然后在随后的所有调用中重复使用这个值。

FXMLLoader.load(new URL("file:////" + jdirProp + "/javafx/" + name + ".fxml"));

但问题是,你为什么不把你的 fxml 文件放在资源下,然后调用:

FXMLLoader.load(getClass().getResource("yourfile.fxml"));

这是最快最优雅的方式。延迟是由于您的 jar 没有被类加载器加载(因为它不在类路径上)并且资源不容易获得,所以在您可以使用 jar 文件内容之前会有一点延迟。

【讨论】:

  • 我已经尝试了两种建议的解决方案: FXMLLoader.load(InputStream) 出于某种原因,我只是没有那个功能。 load() 只需要 URL...我正在使用 Java 8 和 Eclipse 的 EclipseFX 插件。我也无法使用 getClass().getResource() 加载我的文件,因为我只是得到一个 NullPointerException: Location required,因为我是从 .jar 加载的 编辑:没关系,我只是有一个小错字。使用getResource() 加载有效。我仍然需要进行性能测试。
  • @Tewan Here's a link to the FXMLoader.load(InputStream) method documentation。注意,这是一个 instance 方法。
  • 已经有一段时间了,但现在我想回到这个问题。所以我现在使用 fxmlloader.load(getClass().getResourceAsStream("/assets/javafx/file.fxml")) 从类路径加载 fxml 文件问题是,我仍然有这个延迟......
  • 您总是可以尝试像 XRebel、Stackify Prefix(这是免费的,提供 Xrebel 等大部分功能)、JProfiler 等分析器。
猜你喜欢
  • 2014-02-03
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2015-08-31
  • 2017-02-08
  • 1970-01-01
相关资源
最近更新 更多