gpt4 book ai didi

java - 在初始化中访问 FXML 元素时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-02 11:47:13 24 4
gpt4 key购买 nike

我正在 JavaFX 中创建一个导出对话框,该对话框是从 .fxml 文件加载的。要初始化该方法,我想使用initialize() 方法。然而,当在initialize()调用期间访问@FXML gui元素时,我收到一个NullPointerException,因为它们仍然为空。

这是我在 Controller 中创建对话框的代码。MainController 类:

        // Create dialog
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/view/exportDialog.fxml" ));
AnchorPane exportDialog = (AnchorPane) loader.load();
exportController = (ExportDialogController)loader.getController();
Stage dialogStage = new Stage();
dialogStage.setTitle("Export...");
dialogStage.initModality(Modality.WINDOW_MODAL);
dialogStage.initOwner(this.stage);
Scene scene = new Scene(exportDialog);
dialogStage.setScene(scene);
dialogStage.show();

这是导出对话框的 Controller ,存储在controller.ExportDialogController中:

public class ExportDialogController {
Stage stage = null;

// GUI Elements
@FXML
private AnchorPane anchorPane;

@FXML
private ProgressBar exportProgressBar;

@FXML
private Label exportStatusLabel;

@FXML
private Button exportButton;

public void initialize() {
Stage stage = (Stage)exportButton.getScene().getWindow();
stage.setOnCloseRequest(event -> close());
}
}

这是我的 .fxml 文件的代码,它存储在 view.exportDialog 中:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressBar?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.ExportDialogController">
<children>
<ProgressBar fx:id="exportProgressBar" layoutX="75.0" layoutY="155.0" prefHeight="28.0" prefWidth="450.0" progress="0.0" AnchorPane.leftAnchor="25.0" AnchorPane.rightAnchor="25.0" AnchorPane.topAnchor="50.0" />
<Label layoutX="47.0" layoutY="42.0" prefHeight="17.0" prefWidth="218.0" text="Exporting dataset....." AnchorPane.leftAnchor="25.0" AnchorPane.topAnchor="25.0" />
<Label fx:id="exportStatusLabel" alignment="CENTER" layoutX="286.0" layoutY="203.0" text="Export successful!" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="90.0" />
<Button fx:id="exportButton" layoutX="261.0" layoutY="115.0" mnemonicParsing="false" onAction="#exportButtonPressed" prefHeight="25.0" prefWidth="79.0" text="Cancel" AnchorPane.bottomAnchor="25.0" AnchorPane.topAnchor="120.0" />
</children>
</AnchorPane>

我已在 .fxml 文件中链接了 Controller ,并且还添加了 fx:ids。

enter image description here

根据JavaFX的文档,此时gui元素应该已经被注入(inject)了。

我在这里做错了什么?

最佳答案

initialize()方法在调用 loader.load() 期间被调用。显然,导出按钮此时不一定是场景的一部分(直到您调用 new Scene(exportDialog) 才会发生这种情况),因此 exportButton.getScene()返回 null 和 exportButton.getScene().getWindow()抛出空指针异常。

由于该阶段是通过 MainController 中的代码进行管理的类,你应该在那里注册监听器:

    // Create dialog
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/view/exportDialog.fxml" ));
AnchorPane exportDialog = (AnchorPane) loader.load();
exportController = (ExportDialogController)loader.getController();
Stage dialogStage = new Stage();

dialogStage.setOnCloseRequest(event -> exportController.close());

dialogStage.setTitle("Export...");
dialogStage.initModality(Modality.WINDOW_MODAL);
dialogStage.initOwner(this.stage);
Scene scene = new Scene(exportDialog);
dialogStage.setScene(scene);
dialogStage.show();

并从 initialize() 中删除代码ExportDialogController中的方法.

关于java - 在初始化中访问 FXML 元素时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48114675/

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