情况
我正在尝试构建一个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线程上,以确保预期的行为。
重要
答案不完整,它是当前搜索它的任何人的占位符,这解决了问题。
改进
我会尽快用更多的信息和可复制的例子来更新这个问题。此外,我将在评论的帮助下继续研究,为这个问题找到可靠的解释。同时,请随意编辑或发布新的更好的答案。