JavaFX プログラムを終了するとき、保存されていない変更をチェックするために Application.stop() をオーバーライドしています。これは問題なく動作しますが、操作をキャンセルするオプションをユーザーに提供すると便利です。
11447 次
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 に答える