java 为什么控制器类中的所有FXML引用都为null?[关闭]

z9ju0rcb  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(233)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
昨天关门了。
Improve this question
我正在使用JavaFX和FXML构建一个桌面应用程序。我有一个FXML文件和一个对应的控制器类。但是,当我试图引用控制器类中的任何FXML元素时,它们都是null。
下面是我的代码的简化版本:
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文件和控制器类具有正确的包名称,但没有一个有效。

ajsxfq5m

ajsxfq5m1#

问题是JavaFX FXML控制器类与FXML文件没有正确关联。因此,控制器类中所有对对象的引用都为null,即使它们已经初始化。
为了解决这个问题,通过编写代码loader.setController(this)在类中指定了控制器类;

FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
loader.setController(this);
Scene scene = new Scene(loader.load());
primaryStage.setScene(scene);
primaryStage.show();

不要在FXML文件中指定控制器名称,因为FXMLLoader将创建另一个示例并使用它来代替主示例。

相关问题