JavaFX运行报错:FXML加载失败,缺失Gluon控件依赖
JavaFX执行时无法加载Scene Builder创建的FXML,报ClassNotFoundException: com.gluonhq.charm.glisten.control.Avatar
问题根源
报错核心是JVM找不到com.gluonhq.charm.glisten.control.Avatar类,原因是你在FXML中使用了Gluon Charm Glisten框架的自定义控件(Avatar、BottomNavigationButton),但这些控件不属于JavaFX标准库,项目未引入对应依赖。
报错信息
javafx.fxml.LoadException: /C:/Users/DELL/eclipse-workspace/RiadFxProject/bin/application/RiadFxml.fxml at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2714) at javafx.fxml/javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2986) at javafx.fxml/javafx.fxml.FXMLLoader.processImport(FXMLLoader.java:2830) at javafx.fxml/javafx.fxml.FXMLLoader.processProcessingInstruction(FXMLLoader.java:2765) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2631) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2555) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3368) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3324) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3292) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3264) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3240) at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3233) at RiadFxProject/application.Main.start(Main.java:24) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: java.lang.ClassNotFoundException: com.gluonhq.charm.glisten.control.Avatar at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at javafx.fxml/javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:3054) at javafx.fxml/javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:3043) at javafx.fxml/javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2984) ... 20 more
涉及代码
Main.java:
package application; import javafx.scene.text.*; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Group; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.scene.text.Text; import javafx.stage.Stage; public class Main extends Application { public static void main(String []args) { launch(args); } @Override public void start(Stage stage) throws Exception { try { AnchorPane root = (AnchorPane) FXMLLoader.load(Main.class.getResource("/application/RiadFxml.fxml")); Scene scene=new Scene(root,400,400); stage.setScene(scene); stage.show(); }catch(Exception e) { e.printStackTrace(); } } }
RiadFxml.fxml:
<?xml version="1.0" encoding="UTF-8"?> <?import com.gluonhq.charm.glisten.control.Avatar?> <?import com.gluonhq.charm.glisten.control.BottomNavigationButton?> <?import javafx.scene.control.Button?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.shape.Arc?> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller=".FXMLController"> <children> <Avatar layoutX="47.0" layoutY="52.0" /> <BottomNavigationButton layoutX="397.0" layoutY="39.0" /> <Arc fill="DODGERBLUE" layoutX="126.0" layoutY="200.0" length="270.0" radiusX="100.0" radiusY="100.0" startAngle="45.0" stroke="BLACK" strokeType="INSIDE" type="ROUND" /> <Button layoutX="222.0" layoutY="188.0" mnemonicParsing="false" text="Button" /> <Button layoutX="353.0" layoutY="188.0" mnemonicParsing="false" text="Button" /> </children> </AnchorPane>
解决步骤
1. 引入Gluon Charm Glisten依赖
根据项目构建工具选择对应方式:
- Maven:在
pom.xml中添加依赖<dependency> <groupId>com.gluonhq</groupId> <artifactId>charm-glisten</artifactId> <version>6.2.0</version> <!-- 使用最新稳定版本 --> </dependency> - Gradle:在
build.gradle中添加依赖implementation 'com.gluonhq:charm-glisten:6.2.0' - 手动导入Jar:下载Charm Glisten的jar包,添加到Eclipse项目的Build Path(右键项目 → Build Path → Add External Archives)。
2. 修复FXML控制器路径
FXML中fx:controller=".FXMLController"的写法存在路径歧义,若控制器类在application包下,建议改为完整路径:
fx:controller="application.FXMLController"
确保控制器类存在且路径正确。
3. 验证资源路径
确认RiadFxml.fxml文件的位置:
- 普通Eclipse项目:放在
src/application目录下; - Maven项目:放在
src/main/resources/application目录下。Main.class.getResource("/application/RiadFxml.fxml")的路径写法正确,无需修改。
内容的提问来源于stack exchange,提问作者Riad Xploz
相关产品推荐
相关产品推荐

