假设您要询问用户是否要在不保存工作的情况下退出应用程序。如果用户选择“否”,则无法避免应用程序在 stop 方法中关闭。在这种情况下,您应该将事件筛选器添加到WINDOW_CLOSE_REQUEST事件的窗口中。
在 start 方法中添加以下代码以检测事件:
(请注意,调用 Platform.exit(); 不会触发 WindowEvent.WINDOW_CLOSE_REQUEST 事件,请参阅下文了解如何从自定义按钮手动触发事件)
// *** Only for Java >= 8 ****
// ==== This code detects when an user want to close the application either with
// ==== the default OS close button or with a custom close button ====
primaryStage.getScene().getWindow().addEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST, this::closeWindowEvent);
然后添加自定义逻辑。在我的例子中,我使用警报弹出窗口询问用户是否要关闭应用程序而不保存。
private void closeWindowEvent(WindowEvent event) {
System.out.println("Window close request ...");
if(storageModel.dataSetChanged()) { // if the dataset has changed, alert the user with a popup
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.getButtonTypes().remove(ButtonType.OK);
alert.getButtonTypes().add(ButtonType.CANCEL);
alert.getButtonTypes().add(ButtonType.YES);
alert.setTitle("Quit application");
alert.setContentText(String.format("Close without saving?"));
alert.initOwner(primaryStage.getOwner());
Optional<ButtonType> res = alert.showAndWait();
if(res.isPresent()) {
if(res.get().equals(ButtonType.CANCEL))
event.consume();
}
}
}
该方法可防止应用程序关闭。显然,您应该至少添加一个按钮,允许用户关闭应用程序,以避免用户强制关闭应用程序,在某些情况下可能会损坏数据。event.consume()
最后,如果必须从自定义关闭按钮触发事件,则可以使用以下命令:
Window window = Main.getPrimaryStage() // Get the primary stage from your Application class
.getScene()
.getWindow();
window.fireEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSE_REQUEST));