利用javaFx编程时引入第三方jar包,用SceneBuilder打开对应fxml文件报错时各种原因汇总

3 篇文章 0 订阅
1 篇文章 0 订阅

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中进行页面展示。(如下图)
对应fxml文件右键选择

打开后情况

最近我在学习一个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却打不开的情况。

通过一波网上冲浪,汇总了类似问题的各种具体的原因和解决办法如下:

  1. JDK版本问题
    openJDK阉割了javafx相关的包,如果使用的是openjdk不仅在Scene Builder中无法运行,项目本身也是运行不了的。
    解决办法:将openJDK更换为oracle公司的JDK包
    相关文章:https://blog.csdn.net/Seky_fei/article/details/116802863
  2. 项目中引入了第三方的javafx包
    由于相关的javafx包没有导入Scene Builder中,因此Scene Builder识别不出相关第三方组件
    解决办法:打开Scene Builder中的JAR/FXML manager 进行相关第三方jar包导入
    在这里插入图片描述
    值得一提的是,导入jar包时我先尝试通过本地导入jar包,但是Scene Builder还是无法正常使用,后来通过jar包坐标导入第三方jar包时就可以正常使用了(这个地方折磨了我好几个小时哈哈)
    在这里插入图片描述
  3. 其他方法
    看到其他小伙伴是通过更改Scene Builder默认的jar包解决的,我尝试过没有什么成效,这里就放个链接:https://blog.csdn.net/qq_34695230/article/details/104877875
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,你需要了解JavaFX和Scene Builder的基本使用方法。接下来,我们就可以开始构建TreeView文件树了。 1. 创建一个JavaFX项目,并在Scene Builder中打开fxml文件。 2. 在左侧“Library”面板中搜索TreeView并将其拖动到fxml文件中的适当位置。 3. 在TreeView中添加根节点,可以通过右键单击TreeView并选择“Add Root”来完成。 4. 添加子节点,可以通过右键单击父节点并选择“Add Child”来完成。 5. 设置节点的文本和图标,可以通过双击节点并在弹出窗口中进行编辑。 6. 添加事件处理程序,可以通过右键单击节点并选择“Add Event Handler”来完成。 7. 运行程序并查看TreeView的效果。 下面是一个简单的TreeView文件树案例的示例代码: ```java public class MainController implements Initializable { @FXML private TreeView<String> treeView; @Override public void initialize(URL url, ResourceBundle rb) { TreeItem<String> rootItem = new TreeItem<>("Root"); rootItem.setExpanded(true); treeView.setRoot(rootItem); TreeItem<String> itemA = new TreeItem<>("Item A"); TreeItem<String> itemB = new TreeItem<>("Item B"); TreeItem<String> itemC = new TreeItem<>("Item C"); rootItem.getChildren().addAll(itemA, itemB, itemC); TreeItem<String> itemD = new TreeItem<>("Item D"); TreeItem<String> itemE = new TreeItem<>("Item E"); TreeItem<String> itemF = new TreeItem<>("Item F"); itemA.getChildren().addAll(itemD, itemE, itemF); treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { System.out.println("Selected Item: " + newValue.getValue()); }); } } ``` 在这个示例代码中,我们创建了一个TreeView,并添加了根节点和子节点。我们还使用了一个事件监听器来捕获用户选择的节点,并在控制台上打印出节点的值。 你可以使用Scene Builder来编辑这个fxml文件,然后在Java代码中加载它。在Main方法中,你需要添加以下代码: ```java public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("main.fxml")); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 这里我们使用FXMLLoader从fxml文件中加载根节点,并将其添加到场景中。你可以在Scene Builder中对场景进行更多的编辑和布局。 最后,你需要运行这个程序,就可以看到一个简单的TreeView文件树了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿小表弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值