SceneBuilder无法打开含JFoenix元素的FXML文件,求解决方法
解决SceneBuilder打开含JFoenix元素FXML文件的空指针异常
环境信息
- Java版本:11.0.19 2023-04-18 LTS
- SceneBuilder:版本20.0.0,JavaFX版本20.0.1,运行Java版本20(OpenJDK)
- 已尝试JFoenix版本:jfoenix-8.0.10.jar、jfoenix-9.0.10.jar、jfoenix-17.0.2.jar、jfoenix-17.0.5.jar、jfoenix-19.0.1.jar,均无效
异常信息
java.lang.NullPointerException: 无法调用"javafx.scene.Node.getLayoutBounds()",因为"this.textNode"为空 在 com.jfoenix.skins.JFXTextFieldSkin.updateTextPos(JFXTextFieldSkin.java:109) 在 com.jfoenix.skins.JFXTextFieldSkin.layoutChildren(JFXTextFieldSkin.java:93) 在 javafx.controls@20.0.1/javafx.scene.control.Control.layoutChildren(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.SubScene.layoutPass(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Group.prefWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Group.minWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.layout.Region.computeChildPrefAreaWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.layout.Region.getMaxAreaWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.layout.Region.computeMaxPrefAreaWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.layout.StackPane.computePrefWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.prefWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.layout.Region.prefWidth(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.layout.Region.minWidth(未知来源) 在 javafx.controls@20.0.1/javafx.scene.control.skin.ScrollPaneSkin.computeScrollNodeSize(未知来源) 在 javafx.controls@20.0.1/javafx.scene.control.skin.ScrollPaneSkin.layoutChildren(未知来源) 在 javafx.controls@20.0.1/javafx.scene.control.Control.layoutChildren(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Parent.layout(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Scene.doLayoutPass(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Scene.preferredSize(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Scene$2.preferredSize(未知来源) 在 javafx.graphics@20.0.1/com.sun.javafx.scene.SceneHelper.preferredSize(未知来源) 在 javafx.graphics@20.0.1/javafx.stage.Window$12.invalidated(未知来源) 在 javafx.base@20.0.1/javafx.beans.property.BooleanPropertyBase.markInvalid(未知来源) 在 javafx.base@20.0.1/javafx.beans.property.BooleanPropertyBase.set(未知来源) 在 javafx.graphics@20.0.1/javafx.stage.Window.setShowing(未知来源) 在 javafx.graphics@20.0.1/javafx.stage.Window.show(未知来源) 在 javafx.graphics@20.0.1/javafx.stage.Stage.show(未知来源) 在 com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractWindowController.openWindow(AbstractWindowController.java:152) 在 com.oracle.javafx.scenebuilder.app.DocumentWindowController.openWindow(DocumentWindowController.java:1228) 在 com.oracle.javafx.scenebuilder.app.SceneBuilderApp.performOpenFiles(SceneBuilderApp.java:675) 在 com.oracle.javafx.scenebuilder.app.SceneBuilderApp.handleOpenFilesAction(SceneBuilderApp.java:513) 在 com.oracle.javafx.scenebuilder.app.welcomedialog.WelcomeDialogWindowController.handleOpen(WelcomeDialogWindowController.java:221) 在 com.oracle.javafx.scenebuilder.app.welcomedialog.WelcomeDialogWindowController.fireOpenRecentProject(WelcomeDialogWindowController.java:194) 在 com.oracle.javafx.scenebuilder.app.welcomedialog.WelcomeDialogWindowController.lambda$loadAndPopulateRecentItemsInBackground$2(WelcomeDialogWindowController.java:155) 在 javafx.base@20.0.1/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventUtil.fireEventImpl(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventUtil.fireEvent(未知来源) 在 javafx.base@20.0.1/javafx.event.Event.fireEvent(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Node.fireEvent(未知来源) 在 javafx.controls@20.0.1/javafx.scene.control.Button.fire(未知来源) 在 javafx.controls@20.0.1/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(未知来源) 在 javafx.controls@20.0.1/com.sun.javafx.scene.control.inputmap.InputMap.handle(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventUtil.fireEventImpl(未知来源) 在 javafx.base@20.0.1/com.sun.javafx.event.EventUtil.fireEvent(未知来源) 在 javafx.base@20.0.1/javafx.event.Event.fireEvent(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Scene$MouseHandler.process(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Scene.processMouseEvent(未知来源) 在 javafx.graphics@20.0.1/javafx.scene.Scene$ScenePeerListener.mouseEvent(未知来源) 在 javafx.graphics@20.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(未知来源) 在 javafx.graphics@20.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(未知来源) 在 java.base/java.security.AccessController.doPrivileged(未知来源) 在 javafx.graphics@20.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(未知来源) 在 javafx.graphics@20.0.1/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(未知来源) 在 javafx.graphics@20.0.1/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(未知来源) 在 javafx.graphics@20.0.1/com.sun.glass.ui.View.handleMouseEvent(未知来源) 在 javafx.graphics@20.0.1/com.sun.glass.ui.View.notifyMouse(未知来源) 在 javafx.graphics@20.0.1/com.sun.glass.ui.win.WinApplication._runLoop(本地方法) 在 javafx.graphics@20.0.1/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(未知来源) 在 java.base/java.lang.Thread.run(未知来源)
解决办法
- 版本匹配:SceneBuilder使用JavaFX 20,必须搭配适配JavaFX 20的JFoenix版本。官方正式版暂未发布对应版本,可自行编译JFoenix最新源码(已支持JavaFX 20),或使用社区适配的20版本包。
- 临时替换组件:编辑FXML时,先将
JFXTextField替换为标准TextField,完成编辑后再改回JFXTextField。 - 降级SceneBuilder:将SceneBuilder降级至与项目JavaFX版本一致的版本(如JavaFX 17对应SceneBuilder 17),再使用JFoenix 17.x版本即可正常兼容。
- 检查FXML配置:确保
JFXTextField设置了text属性(即使是空字符串),避免皮肤初始化时textNode为空,示例:
<JFXTextField text="" />
内容的提问来源于stack exchange,提问作者user1034461
相关产品推荐
相关产品推荐

