gpt4 book ai didi

JavaFX Controller 始终为空

转载 作者:行者123 更新时间:2023-11-29 07:48:53 27 4
gpt4 key购买 nike

我将尝试使用 JavaFX 2 并使用一个简单的演示应用程序。该项目由 3 个文件组成,Main.java、Controller.java 和 sample.fxml。

在 Sample.fxml 中我声明了 Controller :

<GridPane fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>

在我的 Main.java 中,我尝试访问 Controller

    FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(getClass().getResource("sample.fxml"));
System.out.println(loader.getController()); //prints always null

所以我的第一个想法是映射不起作用。所以我在 Controller 中添加了一个初始化方法。

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
System.out.println("init");
}

现在的输出是:

init

null

所以我现在的问题是如何访问给定 fxml 文件的 Controller ?

最佳答案

FXMLLoader.load(URL) 方法是一个静态方法。所以当你执行

  FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(getClass().getResource("sample.fxml"));

您没有从您构造的 FXMLLoader 实例(“加载器”)加载 FXML 文件。 (您实际上是通过对象引用调用静态方法。)因此加载程序的 Controller 永远不会被初始化。

你需要

  FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = loader.load();

这会构造一个指定位置的加载器,然后在 FXMLLoader 实例上正确调用不是静态方法的 load() 方法。然后

System.out.println(loader.getController());

将给出正确的结果。

关于JavaFX Controller 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22910611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com