You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:22:03