Вы можете сделать это довольно просто, прерывая нормальный жизненный цикл JavaFX. Мы можем перехватить любые запросы, чтобы закрыть окно и запустить наш собственный процесс, чтобы разрешить или отклонить запрос.
Я включил простое приложение (с комментариями), которое демонстрирует концепцию:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import java.util.Optional;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple interface
VBox root = new VBox(5);
root.setPadding(new Insets(10));
root.setAlignment(Pos.CENTER);
// Button to close the window/application
Button btnExit = new Button("Exit");
btnExit.setOnAction(event -> {
if (confirmExit()) {
primaryStage.close();
}
});
// Now, add a custom handler on the Window event so we can handle the requast ourselves
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
// Run the confirmExit() method and consume the event if the user clicks NO, otherwise Exit
if (confirmExit()) {
primaryStage.close();
} else {
// Consume the event. This prevents the window from closing and the application exiting.
event.consume();
}
}
});
root.getChildren().add(btnExit);
// Show the Stage
primaryStage.setWidth(300);
primaryStage.setHeight(300);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
private boolean confirmExit() {
// Get confirmation that you want to exit
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Exit?");
alert.setHeaderText("Are you sure you want to exit?");
alert.getButtonTypes().setAll(
ButtonType.YES,
ButtonType.NO
);
// Get the result of the Alert (which button was selected
Optional<ButtonType> result = alert.showAndWait();
// Return true if the user clicked YES, false if they click NO or close the alert.
return result.orElse(ButtonType.NO) == ButtonType.YES;
}
}
При использовании этого метода метод handleExit()
вызывается независимо от того, нажимает ли пользователь кнопку или закрывает окно. Вы можете выполнять свою работу по сохранению файлов этим методом.