JavaFX控制器实例化时为空



我已经被这个问题困了好几个小时了。我不知道为什么我的控制器从JavaFX是指向null。我在scene builder中制作了一个JavaFX GUI,将控制器类添加到我的项目中,并使用适当的骨架代码。但是当我在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

我按照这里和这里提到的说明,以及其他一些StackOverflow页面。我正在复制指令,正如他们提到的,但我仍然得到我的控制器为空。

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

我需要在.fxml文档的根标签中手动添加fx:controller="SampleController",在我的情况下是<AnchorPane>标签,现在它起作用了。

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

如果使用"场景构建器";然后点击左下角的控制器标签和输入在文本字段"控制器类"start()方法中给出的所选实例名。

最新更新