javafx可以说是java官方为了弥补java swing在java图形化编程上的痛点而开发的另一种图形化界面编程方式。
利用javaFx结合图形化编程工具Scene
Builder(官网:https://www.oracle.com/java/technologies/javafxscenebuilder-1x-archive-downloads.html)进行编程可以快速提高效率。
以往我在使用Scene Builder时都是在项目中对应的fxml页面右键选择“open in Scene Builder”,即可跳转到Scene Builder中进行页面展示。(如下图)
最近我在学习一个javaFx项目时想要这样打开Scene Builder进行页面图形化展示时却报错了(项目是可以正常运行的,打开Scene Builder却会报错)
具体报错信息为
java.io.IOException: javafx.fxml.LoadException:
/D:/*******/group_type_management.fxml
at com.oracle.javafx.scenebuilder.kit.fxom.FXOMLoader.load(FXOMLoader.java:98)
at com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument.<init>(FXOMDocument.java:89)
at com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument.<init>(FXOMDocument.java:106)
at com.oracle.javafx.scenebuilder.kit.editor.EditorController.updateFxomDocument(EditorController.java:2540)
at com.oracle.javafx.scenebuilder.kit.editor.EditorController.setFxmlTextAndLocation(EditorController.java:761)
at com.oracle.javafx.scenebuilder.app.DocumentWindowController.loadFromFile(DocumentWindowController.java:385)
at com.oracle.javafx.scenebuilder.app.SceneBuilderApp.performOpenFiles(SceneBuilderApp.java:672)
at com.oracle.javafx.scenebuilder.app.SceneBuilderApp.access$100(SceneBuilderApp.java:98)
at com.oracle.javafx.scenebuilder.app.SceneBuilderApp$1.invalidated(SceneBuilderApp.java:524)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:137)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:72)
at javafx.beans.property.ReadOnlyBooleanWrapper.fireValueChangedEvent(ReadOnlyBooleanWrapper.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:144)
at com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary.lambda$updateFirstExplorationCompleted$6(UserLibrary.java:352)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
Caused by: javafx.fxml.LoadException:
/D:/Coding/RS/cityRsProject/falsework-client/src/main/resources/fxml/admin/groupType/group_type_management.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2848)
at javafx.fxml.FXMLLoader.processImport(FXMLLoader.java:2692)
at javafx.fxml.FXMLLoader.processProcessingInstruction(FXMLLoader.java:2661)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2517)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)
at com.oracle.javafx.scenebuilder.kit.fxom.FXOMLoader.load(FXOMLoader.java:93)
... 22 more
Caused by: java.lang.ClassNotFoundException: com.jfoenix.controls.JFXButton
at java.lang.ClassLoader.findClass(ClassLoader.java:530)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2916)
at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905)
at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846)
... 27 more
通过分析可得报错的原因是因为Scene Builder里面的相关组件缺失导致不能正常打开,原来Scene Builder里面的组件代码和JDK或其他jar包里的组件代码是独立的,Scene Builder里面缺失相关组件代码就会产生项目能运行,在Scene Builder却打不开的情况。
通过一波网上冲浪,汇总了类似问题的各种具体的原因和解决办法如下:
- JDK版本问题
openJDK阉割了javafx相关的包,如果使用的是openjdk不仅在Scene Builder中无法运行,项目本身也是运行不了的。
解决办法:将openJDK更换为oracle公司的JDK包
相关文章:https://blog.csdn.net/Seky_fei/article/details/116802863 - 项目中引入了第三方的javafx包
由于相关的javafx包没有导入Scene Builder中,因此Scene Builder识别不出相关第三方组件
解决办法:打开Scene Builder中的JAR/FXML manager 进行相关第三方jar包导入
值得一提的是,导入jar包时我先尝试通过本地导入jar包,但是Scene Builder还是无法正常使用,后来通过jar包坐标导入第三方jar包时就可以正常使用了(这个地方折磨了我好几个小时哈哈)
- 其他方法
看到其他小伙伴是通过更改Scene Builder默认的jar包解决的,我尝试过没有什么成效,这里就放个链接:https://blog.csdn.net/qq_34695230/article/details/104877875