7

退出 JavaFX 程序时,我将覆盖 Application.stop() 以检查未保存的更改。这可以正常工作,但最好让用户选择取消操作。

4

1 回答 1

19

Application.stop() 是最后机会沙龙,换句话说,虽然它确实捕获了退出,但撤销退出过程有点晚了。

更好的是为关闭请求设置一个监听器,可以通过消费事件来取消。

在应用程序类中:

public void start(Stage stage) throws Exception {
    FXMLLoader ldr = new FXMLLoader(getClass()
                .getResource("Application.fxml"));
    Parent root = (Parent) ldr.load();
    appCtrl = (ApplicationController) ldr.getController();

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();

    scene.getWindow().setOnCloseRequest(new EventHandler<WindowEvent>() {
        public void handle(WindowEvent ev) {
            if (!appCtrl.shutdown()) {
                ev.consume();
            }
        }
    });
}

然后在应用程序控制器中,appCtrl如上引用:

/** reference to the top-level pane                               */
@FXML
private AnchorPane mainAppPane;

public boolean shutdown() {
    if (model.isChanged()) {
        DialogResult userChoice =
                ConfirmDialog.showYesNoCancelDialog("Changes Detected",
                "Do you want to save the changes?  Cancel revokes the "
                + "exit request.",
                mainAppPane.getScene().getWindow());

        if (userChoice == DialogResult.YES) {
            fileSave(null);

            if (model.isChanged()) {
                // cancelled out of the save, so return to the app
                return false;
            }
        }

        return userChoice == DialogResult.NO;
    }

    return true;
}

注意:在 FXML 中引用了 mainAppPane(在这种情况下使用 JavaFX 场景构建器)以允许访问场景和窗口;该对话框是从https://github.com/4ntoine/JavaFxDialog扩展而来的,而 fileSave 是 File -> Save 菜单项的事件处理程序。对于文件 -> 退出菜单项:

@FXML
private void fileExitAction(ActionEvent ev) {
    if (shutdown()) {
        Platform.exit();
    }
}

希望这对某人有帮助!

于 2012-12-05T16:00:36.117 回答