我们正在使用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进行更新。事实证明,适用于Java 10的Scene Builder比适用于Java 8的Scene Builder快得多(不确定为什么)。因此,我们希望继续使用Scene Builder for Java 10,但我们始终将代码编写为与Java 8兼容,并且始终使用JRE 8进行所有测试。
我们曾经考虑过多种变通办法,但是它们似乎都有些怪异,而且绝对更像是变通办法,而不是真正的解决方案。我真正希望看到的是一种告诉Scene Builder使用较旧API版本的方法,或者是一种告诉FXML加载程序忽略版本号的方法。看来这似乎是不可能的。
将xmlns="http://javafx.com/javafx/10.0.1"
属性更改为xmlns="http://javafx.com/javafx/8.0.192"
并不难,但是每次在Scene Builder中对其进行修改时都会对其进行更新,因此必须不断对其进行更改是很痛苦的。我曾考虑过制作一个git hook在提交时自动执行,但是我们使用的是Eclipse,而egit钩子集成实际上是不存在的。
我们可以创建一个FXMLLoading实用程序,用于所有FXML加载。它实际上可以在加载stderr之前将其禁用,然后重新启用它。但这不是线程安全的,并且可能同时打印到stderr的所有其他内容都会丢失。
我们还可以将stderr重定向到一个对象,该对象根据当前正在运行的线程来确定应打印的内容,或者仅通过省略与我们所看到的FXML警告相匹配的文本即可。不过,这似乎还是很hacky。
我们可以创建一个使用load(InputStream)
的FXML加载实用程序,并将其传递到自定义的InputStream
中,以过滤或修改该xmlns
属性。我认为这可能是我最喜欢的解决方案,但似乎仍然有些麻烦。