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;
}

注意: mainAppPane は FXML で参照され (この場合は JavaFX Scene Builder を使用)、シーンとウィンドウへのアクセスを許可します。ダイアログはhttps://github.com/4ntoine/JavaFxDialogから拡張されたもので、fileSave は [ファイル] -> [保存] メニュー項目のイベント ハンドラーです。[ファイル] -> [終了] メニュー項目の場合:

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

これが誰かを助けることを願っています!

于 2012-12-05T16:00:36.117 に答える