Java FXML无法找到Controller类问题求助
问题:FXML无法找到控制器类,移除配置后程序正常运行
尝试将Controller.java与sample.fxml关联时,系统始终提示找不到控制器类;但移除FXML中的控制器配置后,游戏可以正常运行。已尝试多种方案:创建包、从不同目录运行命令、添加fx:root标签、使用绝对/相对文件路径,且sample.fxml中已正确声明包名fx:controller="sample.Controller",控制器类也为public。
部分堆栈跟踪信息
Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893) at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:1589) Caused by: javafx.fxml.LoadException: /Users/awc/GitRepos/comp16412-coursework-2__z78295ac/src/main/sample/sample.fxml:12 at javafx.fxml@20/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2722) at javafx.fxml@20/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:935) at javafx.fxml@20/javafx.fxml.FXMLLoader$RootElement.processAttribute(FXMLLoader.java:1302) at javafx.fxml@20/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:230) at javafx.fxml@20/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:757) at javafx.fxml@20/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2853) at javafx.fxml@20/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2649) at javafx.fxml@20/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2563) at javafx.fxml@20/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2531) at sample.Main.start(Main.java:26) at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839) at javafx.graphics@20/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483) at javafx.graphics@20/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics@20/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455) at javafx.graphics@20/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) Caused by: java.lang.ClassNotFoundException: sample.Controller 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@20/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:933) ... 14 more
文件结构
项目目录结构如下:
- src/main/sample/
- Controller.java
- Main.java
- sample.fxml
- lib/(存放JavaFX库)
编译运行命令
javac --module-path lib --add-modules=javafx.controls,javafx.fxml sample/Main.java java --module-path lib --add-modules=javafx.controls,javafx.fxml sample.Main
相关代码
Controller.java
package sample; import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; public class Controller { public Button startButton; public VBox playerNames; public void startGame(){ for (Node node : playerNames.getChildren()) { System.out.println("Id: " + node.getId()); if (node instanceof TextField) { // 清空文本框 ((TextField)node).setText(""); } } } }
Main.java
package sample; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception{ FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); loader.setRoot(this); // loader.setController(this); loader.setClassLoader(getClass().getClassLoader()); // 设置类加载器 // Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); Parent root = (Parent) loader.load(); primaryStage.setTitle("Hello world"); primaryStage.setScene(new Scene(root, 1000, 500)); primaryStage.show(); } }
sample.fxml
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.geometry.Insets?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.BorderPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.VBox?> <?import javafx.scene.text.Font?> <?import javafx.scene.text.Text?> <?import sample.*?> <fx:root maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: black;" type="BorderPane" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> <center> <VBox fx:id="playerNames" prefHeight="200.0" prefWidth="100.0" style="-fx-padding: 30;" BorderPane.alignment="CENTER"> <children> <TextField prefHeight="26.0" prefWidth="541.0" promptText="Player 1"> <VBox.margin> <Insets bottom="10.0" /> </VBox.margin> </TextField> <TextField promptText="Player 2"> <VBox.margin> <Insets bottom="10.0" top="10.0" /> </VBox.margin> </TextField> <TextField promptText="Player 3"> <VBox.margin> <Insets bottom="10.0" top="10.0" /> </VBox.margin> </TextField> <TextField promptText="Player 4"> <VBox.margin> <Insets bottom="10.0" top="10.0" /> </VBox.margin> </TextField> <TextField prefHeight="26.0" prefWidth="363.0" promptText="Player 5"> <VBox.margin> <Insets top="10.0" /> </VBox.margin> </TextField> </children> <BorderPane.margin> <Insets /> </BorderPane.margin> </VBox> </center> <right> <Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Selfish Space Game - Original Implementation by Ridleys Games" wrappingWidth="124.04833984375" BorderPane.alignment="CENTER"> <BorderPane.margin> <Insets right="50.0" /> </BorderPane.margin> <font> <Font size="18.0" /> </font> </Text> </right> <padding> <Insets right="20.0" /> </padding> <top> <HBox prefHeight="26.0" prefWidth="607.0" BorderPane.alignment="CENTER"> <children> <Button mnemonicParsing="false" text="Rules"> <HBox.margin> <Insets left="30.0" /> </HBox.margin> </Button> <Button mnemonicParsing="false" text="Load Saved Game"> <HBox.margin> <Insets left="30.0" /> </HBox.margin> </Button> </children> <BorderPane.margin> <Insets top="10.0" /> </BorderPane.margin> </HBox> </top> <bottom> <Button fx:id="startButton" mnemonicParsing="false" onAction="#startGame" text="Start Game!" BorderPane.alignment="CENTER"> <BorderPane.margin> <Insets bottom="50.0" /> </BorderPane.margin> <font> <Font size="22.0" /> </font> </Button> </bottom> </fx:root>
内容的提问来源于stack exchange,提问作者Awc
相关产品推荐
相关产品推荐

