当前位置: 首页 > 知识库问答 >
问题:

JavaFX控制器实例化时为空

虞唯
2023-03-14

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

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();
        }
    }
}
import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class SampleController {

    @FXML
    private Label firstLabel;

}
<?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

我遵循了此处和此处提及的说明,以及其他一些StackOverflow页面。我完全按照上面提到的方式复制指令,但我的控制器仍然为空。

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

共有1个答案

叶茂
2023-03-14

我需要手动将fx:controller=“SampleController”添加到的根标记中。fxml文档,在我的例子中是

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

如果使用“场景生成器”,则进入左下角的“控制器”选项卡并在文本字段“控制器类”中输入在start()方法中给出的所选实例名称。

 类似资料:
  • 下面是我的实际控制人课: 我得到了一个例外:

  • 问题内容: 我将尝试使用JavaFX 2,并使用一个简单的演示应用程序。该项目包括3个文件,即Main.java,Controller.java和sample.fxml。 在Sample.fxml中,我声明了控制器: 在我的Main.java中,我尝试访问控制器 所以我的第一个想法是映射不起作用。因此,我在控制器中添加了一个initialize方法。 现在的输出是: 在里面 空值 所以我现在的问题

  • 如何获得对我的控制器类的引用? 这是我的代码片段。 Controller类在FXML中的fx:控制器属性中指定。实例在后台自动创建。我需要访问该实例才能在表单中设置初始值。 我知道我可以用XML设置初始值,但我需要在运行时设置它们。

  • 我正在学习使用SceneBuilder创建一个新的JavaFX应用程序的教程,并尝试向.fxml文件添加一个controller类。 我正在使用Eclipse和Gluon的Scene Builder V8.1.1版本。 在哪里可以将我的.fxml文件连接到我的控制器Java类?

  • 问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为

  • 我试图在JavaFX中获得一个TableView来动态显示内容。 当我运行程序时,出现以下错误: 我的控制器名为“UserInterfaceController.java”,它与FXML文件在同一个包下,我也在FXML中导入了包。为什么找不到控制器? FXML文件: 控制器: 主要类: