JavaFX加载FXML会导致警告,并且无法加载文件(skin/modena)



情况

我正在尝试构建一个JavaFX应用程序,对于GUI,我使用SceneBuilder为不同的根生成fxml文件。然后我启动应用程序,在某个时候,我试图加载一些带有new FXMLLoader(App.class.getResource("myFXML.fxml")).load()的fxml文件,并将其设置为舞台上场景的根。


问题

99%的加载没有任何问题,一切都按预期进行,但这1%将失败,并在不停止应用程序的情况下阻止fxml加载,但只会发出以下警告。

WARNING: Caught 'java.lang.ClassCastException: class java.lang.String 
cannot be cast to class javafx.scene.paint.Paint (java.lang.String is in
module java.base of loader 'bootstrap'; javafx.scene.paint.Paint is in 
module javafx.graphics@18 of loader 'app')' while converting value for 
'-fx-background-color' from rule '*.list-view' in stylesheet 
jar:file:///C:/mysystem/.m2/repository/org/openjfx/javafx-controls/18/javafx-controls-18-win.jar!/com/sun/javafx/scene/control/skin/modena/modena.bss

大多数时候导致它的fxml是一个有ComboBox的,但我认为这与它无关,因为它发生在任何地方。

重要警告也不一致,在最后一行而不是*.list-view,其他时候也说*.button,但我正在做同样的操作来测试它。


再现问题

复制根本不一致,警告是描述性的,似乎问题出现在JavaFX文件上(警告中提到(,而不是我写的东西中。因此,我找不到一种一致的方法来复制它或处理异常或其他什么。


目前已尝试

  • 删除组合框(以防万一(
  • 在互联网上搜索却一无所获
  • 重新安装JDK没有任何作用

注意

我知道我可以提供更多的信息,这可能会有所帮助,但我现在已经筋疲力尽了。也许稍后会添加编辑。

长话短说

我在另一个线程上进行FXML加载(new FXMLLoader(App.class.getResource("myFXML.fxml")).load()(和scene.setRoot(...),而不是在FX线程上。因此,请使用Platform.isFxApplicationThread();(如注释中所述(确保操作发生在FX线程上,以确保预期的行为。


重要

答案不完整,它是当前搜索它的任何人的占位符,这解决了问题。


改进

我会尽快用更多的信息和可复制的例子来更新这个问题。此外,我将在评论的帮助下继续研究,为这个问题找到可靠的解释。同时,请随意编辑或发布新的更好的答案。

最新更新