javaFX FXML:为什么控制器类中的所有 FXML 引用都是空的?

问题描述 投票:0回答:1

我正在使用 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 文件和控制器类具有正确的包名称,但没有一个有效。

java javafx fxml multi-window
1个回答
0
投票

问题是 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 将创建另一个实例并使用它代替主实例。

© www.soinside.com 2019 - 2024. All rights reserved.