在不更改 java 版本的情况下抑制 FXML 版本警告的最简洁方法

问题描述 投票:0回答:1

总结

我们正在使用 Scene Builder 10 开发 FXML,并使用 JRE 8 将其加载到应用程序上。我们确信我们的 FXML 完全兼容 Java 8,但希望禁止在加载 FXML 文件时打印以下警告:

Dec 19, 2018 12:50:14 PM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 10.0.1 by JavaFX runtime of version 8.0.192

我们想了很多种解决方案,但似乎都不是很好。我只是想知道是否有人能想到更好的办法。

请注意,SO 上有一些问题看起来与此非常相似,但到目前为止,它们似乎都通过更新到较新的 JRE 来解决,这对我们来说不是一个选择。

背景

我们的应用程序被交付给各种客户,其中一些客户不愿意更新过去的 JRE 8。事实证明,Scene Builder for java 10 比 Scene Builder for Java 8 快得多(不知道为什么)。因此,我们希望继续使用适用于 Java 10 的 Scene Builder,但我们始终编写符合 Java 8 的代码,并且始终使用 JRE 8 进行所有测试。

解决方法

我们想到了多种解决方法,但它们看起来都有点老套,而且绝对更像是解决方法而不是真正的解决方案。我真正希望看到的是告诉场景生成器使用较旧的 API 版本,或者告诉 FXML 加载器忽略版本号的方法。但看起来这可能是不可能的。

手动更改FXML中的版本号

xmlns="http://javafx.com/javafx/10.0.1"
属性更改为
xmlns="http://javafx.com/javafx/8.0.192"
并不难,但每次在场景生成器中修改它时它都会更新,并且必须不断更改它很痛苦。我想过制作一个 git hook 在提交时自动执行此操作,但我们使用的是 Eclipse,而 egit hook 集成实际上不存在。

FXML 加载时重定向 Stderr

我们可以创建一个用于所有 FXML 加载的 FXMLLoading 实用程序。它实际上可以在加载 stderr 之前禁用它,然后重新启用它。但这不是线程安全的,并且可能同时打印到 stderr 的任何其他内容都会丢失。

我们还可以将 stderr 重定向到一个对象,该对象根据当前运行的线程确定应打印的内容,或者可能只是省略与我们看到的 FXML 警告相匹配的文本。不过,这看起来还是有点老套。

使用自定义输入流加载FXML

我们可以创建一个使用

load(InputStream)
的 FXML 加载实用程序,并将其传递到自定义
InputStream
中,以过滤或修改该
xmlns
属性。我认为这可能是我最喜欢的解决方案,但它看起来仍然有点麻烦。

javafx javafx-8 scenebuilder
1个回答
0
投票

我在使用 SceneBuilder 21 for JRE 17 进行开发时遇到了同样的问题。 对于这个烦恼有一个简单的解决方案。 将以下行添加到 SceneBuilder.cfg:

java-options=-Djavafx.version= 

将其放入 *.fxml 中:

<... xmlns="http://javafx.com/javafx/" xmlns:fx="http://javafx.com/fxml/1">

或者对于 SceneBuilder.cfg 中的 JRE17:

java-options=-Djavafx.version=17 

将其放入 *.fxml 中:

<... xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">

Windows/Linux 中的 SceneBuilder.cfg 位于安装 SceneBuilder-VV-V.jar 的位置,在 macOS 中,您必须进入 SceneBuilder.app ->

/Applications/SceneBuilder.app/Contents/app/SceneBuilder.cfg

注意:到目前为止,fxml 文件中根本没有版本号,没有任何负面影响(事实上,兼容性检查是由使用的 JAVA-IDE 完成的,恕我直言,这已经足够保障了)

© www.soinside.com 2019 - 2024. All rights reserved.