JavaFX 控制器在实例化时为空

JavaFX controller is null when instantiated

我已经坚持了好几个小时了。我不知道为什么我的 JavaFX 控制器指向 null。我在 scene builder 中制作了一个 JavaFX GUI,将控制器 class 添加到我的项目及其适当的框架代码中。但是当我在 start 方法中实例化控制器时,它指向 null。

App.java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class App extends Application{
    public static void main(String[] args) {
        launch(args);
    }

    public static SampleController controller;

    @Override
    public void start(Stage stage) throws Exception {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("testProjectFx.fxml"));
            Parent root = loader.load();

            controller = (SampleController) loader.getController();
            System.out.println("controller is : " + controller);

            Scene scene = new Scene(root, 300, 300);

            stage.setTitle("FXML Welcome");
            stage.setScene(scene);
            stage.show();

        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

SampleController.java

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class SampleController {

    @FXML
    private Label firstLabel;

}

testProjectFx.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label fx:id="firstLabel" layoutX="314.0" layoutY="135.0" text="Label" />
   </children>
</AnchorPane>

错误堆栈跟踪

cd /home/hexaquarks/vscode/testProject ; /usr/bin/env /usr/lib/jvm/java-11-openjdk-amd64/bin/java --module-path /home/hexaquarks/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml,javafx.swing -Dfile.encoding=UTF-8 @/tmp/cp_s5yrrw0jqsav930qkowo7m19.argfile App 
Aug. 11, 2021 1:30:27 P.M. javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 16 by JavaFX runtime of version 11.0.2
controller is : null

文件夹树:

Testproject
├── .vscode
├── bin
├── lib
└── src
    ├── App.java
    ├── SampleController.java
    └── testProjectFx.fxml

我按照 here and here 和其他一些 Whosebug 页面中提到的说明进行操作。我完全按照提到的说明重现了说明,但我的控制器仍然为空。

我缺乏想法,有人知道我做错了什么吗?

我需要在 .fxml 文档的根标签中手动添加 fx:controller="SampleController",在我的例子中是 <AnchorPane> 标签,现在可以了。

<AnchorPane (...) fx:controller="SampleController">
   <children>
      (...)
   </children>
</AnchorPane>

如果使用“Scene Builder”,则进入左下方的“controller”选项卡并在文本字段“controller class”中输入 [=14= 中给出的所选实例名称] 方法。