我正在使用 JavaFX 和 FXML 构建桌面应用程序。我有一个 FXML 文件和一个相应的控制器类。但是,当我尝试在我的控制器类中引用任何 FXML 元素时,它们都是空的。这是我的代码的简化版本: FXML 文件 (sample.fxml):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="root" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<Button fx:id="myButton" layoutX="263.0" layoutY="184.0" onAction="#handleButtonAction" text="Click me!" />
</AnchorPane>
控制器类(Controller.java):
package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
public class Controller {
@FXML
private AnchorPane root;
@FXML
private Button myButton;
public void handleButtonAction() {
System.out.println("Button clicked");
}
public void initialize() {
System.out.println("Root: " + root);
System.out.println("Button: " + myButton);
}
}
在我的控制器类的 initialize() 方法中,root 和 myButton 都为 null,即使它们已在 FXML 文件中定义。关于我可能做错了什么的任何想法?
提前感谢您的帮助!
我已经尝试了我在网上找到的各种解决方案,例如确保 FXML 文件和控制器类具有正确的包名称,但没有一个有效。
问题是 JavaFX FXML 控制器类未与 FXML 文件正确关联。结果,控制器类中所有对对象的引用都是空的,即使它们已经被初始化。
为了解决这个问题,在类中通过写代码loader.setController(this);来指定controller类
FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
loader.setController(this);
Scene scene = new Scene(loader.load());
primaryStage.setScene(scene);
primaryStage.show();
并且不要在 fxml 文件中指定控制器名称,因为 FXMLLoader 将创建另一个实例并使用它代替主实例。