我正在JavaFX中创建一个从.fxml文件加载的导出对话框。要初始化该方法,我想使用 initialize() 方法。但是,在 initialize() 调用期间访问@FXML gui 元素时,我得到一个 NullPointerException,因为它们仍然是空的。
这是我在控制器. 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();
这是存储在控制器中的导出对话框的控制器。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());
}
}
以下是存储在view.exportDialog中的.fxml文件的代码:
<?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文件中链接了控制器,还添加了fx:ids。
根据JavaFX的文档,此时应该已经注入了gui元素。
我到底做错了什么?
初始化(
) 方法在调用 loader.load()
期间调用。显然,并且必然,导出按钮在这一点上不是场景的一部分(直到你调用新的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();
并从 ExportDialogController
中的 initialize()
方法中删除代码。