单击右上角的关闭后,我在关闭二级时遇到了一个小问题。我正在将 fxml 与控制器类一起使用,我需要一种方法来处理这种情况。
这是我所做的,但我得到一个空指针异常:
@Override
public void initialize(URL location, ResourceBundle resources) {
Stage stage = (Stage) tbTabPaneHome.getScene().getWindow();
stage.setOnCloseRequest(e -> {
Platform.exit();
System.exit(0);
});
}
因为舞台还没有完全上线,所以还有其他想法吗?
由于Scene
和Stage
尚未创建,因此您不能调用它们,否则您将获得NPE,正如您已经提到的。
在舞台上安装事件处理程序的一种方法是侦听tbTabPaneHome
sceneProperty()
的变化。
将节点添加到场景后,该属性将为您提供Scene
实例。
但是场景还没有添加到Stage
中,所以你需要等到完成,Platform.runLater()
public void initialize() {
tbTabPaneHome.sceneProperty().addListener((obs, oldScene, newScene) -> {
Platform.runLater(() -> {
Stage stage = (Stage) newScene.getWindow();
stage.setOnCloseRequest(e -> {
Platform.exit();
System.exit(0);
});
});
});
}
您是否尝试完全在主舞台控制器中处理二级?
我想从主应用程序控制器中的按钮或帮助菜单中隐藏或显示帮助窗口。如下所示:
public Button helpBtn;
Stage anotherStage = new Stage();
boolean secondaryInitialyzed = false;
boolean secondaryShowing = false;
public void showOrHideHelp(ActionEvent actionEvent) throws IOException {
if (!secondaryInitialyzed){
Parent anotherRoot = FXMLLoader.load(getClass().getResource("mySecondaryStage.fxml"));
anotherStage.setTitle("Secondary stage");
Scene anotherScene = new Scene(anotherRoot, 500, 350);
anotherStage.setScene(anotherScene);
secondaryInitialyzed = true;
}
if (secondaryShowing){
anotherStage.hide();
secondaryShowing = false;
helpBtn.setText("Show Help");
}
else {
anotherStage.show();
secondaryShowing = true;
helpBtn.setText("Hide Help");
}
它确实有效,并且可能有一种方法可以在主控制器中处理setOnCloseRequest。
我有相反的问题,即通过单击右上角的关闭来阻止关闭二级窗口。我会研究setOnCloseRequest,看看是否有办法。
我还有一个不相关的问题:我可以参考主要位置来定位次要的吗?