在使用 SceneBuilder 和 JFoenix 开发 JavaFX 应用时,遇到 JFoenix 组件无法正常加载的错误是一个常见问题,尤其是在使用较新版本的 JFoenix 和较新版本的 SceneBuilder 时。常见的报错信息如下:

例外: com/jfoenix/controls/JFXButton.class
javafx.fxml.LoadException:
unknown path:2
at javafx.fxml@23.0.1/javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
at javafx.fxml@23.0.1/javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(Unknown Source)
at javafx.fxml@23.0.1/javafx.fxml.FXMLLoader$ValueElement.processStartElement(Unknown Source)
at javafx.fxml@23.0.1/javafx.fxml.FXMLLoader.processStartElement(Unknown Source)
at javafx.fxml@23.0.1/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml@23.0.1/javafx.fxml.FXMLLoader.load(Unknown Source)
at com.oracle.javafx.scenebuilder.kit.library.util.ExplorerBase.instantiateWithFXMLLoader(ExplorerBase.java:56)
at com.oracle.javafx.scenebuilder.kit.library.util.ExplorerBase.exploreEntry(ExplorerBase.java:113)
at com.oracle.javafx.scenebuilder.kit.library.util.JarExplorer.exploreEntry(JarExplorer.java:83)
at com.oracle.javafx.scenebuilder.kit.library.util.JarExplorer.explore(JarExplorer.java:65)
at com.oracle.javafx.scenebuilder.kit.library.user.LibraryFolderWatcher.exploreAndUpdateLibrary(LibraryFolderWatcher.java:381)
at com.oracle.javafx.scenebuilder.kit.library.user.LibraryFolderWatcher.runDiscovery(LibraryFolderWatcher.java:155)
at com.oracle.javafx.scenebuilder.kit.library.user.LibraryFolderWatcher.run(LibraryFolderWatcher.java:100)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
... 13 more
Caused by: java.lang.NoClassDefFoundError: com/sun/javafx/css/StyleConverterImpl
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
at java.base/java.net.URLClassLoader.defineClass(Unknown Source)
at java.base/java.net.URLClassLoader$1.run(Unknown Source)
at java.base/java.net.URLClassLoader$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.net.URLClassLoader.findClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at com.jfoenix.controls.JFXButton$StyleableProperties.<clinit>(JFXButton.java:207)
at com.jfoenix.controls.JFXButton.<init>(JFXButton.java:155)
... 16 more
Caused by: java.lang.ClassNotFoundException: com.sun.javafx.css.StyleConverterImpl
at java.base/java.net.URLClassLoader.findClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 28 more
问题分析
这个错误表明 SceneBuilder 无法正确加载 JFoenix 组件,比如 JFXButton 和 JFXCheckBox。从日志中可以看到,报错涉及 com/jfoenix/controls/JFXButton.class 和 com/jfoenix/controls/JFXCheckBox.class 等类。这通常是由于 SceneBuilder 与所使用的 JFoenix 版本不兼容。
原因:版本不兼容
JFoenix 是一个基于 JavaFX 的 Material Design 风格组件库,但由于它在不同版本的 Java 和 SceneBuilder 中的兼容性差异,可能会导致加载失败。尤其是在使用与 Java 8 不兼容的 SceneBuilder 版本时,可能会遇到组件无法识别的问题。
解决方案:使用 Java 8 版本的 SceneBuilder
为了避免版本冲突,我们可以选择使用与 Java 8 兼容的 SceneBuilder 版本,这样就能正确加载 JFoenix 组件。
1. 下载 Java 8 版本的 SceneBuilder
可以从 OpenJFX 中文官网 下载 Java 8 版本的 SceneBuilder。该版本完全兼容 JFoenix,并能够正确加载如 JFXButton、JFXCheckBox 等控件。
2. 安装并使用 Java 8 版本的 SceneBuilder
- 下载并安装 Java 8 版本的 SceneBuilder。
- 安装完成后,打开 SceneBuilder,加载你的 FXML 文件,此时
JFoenix组件应该能够正常显示和使用。

5271

被折叠的 条评论
为什么被折叠?



