Empêcher ou annuler la sortie JavaFX 2

quand je quitte un programme JavaFX, je passe à L'Application supérieure.stop() pour vérifier les modifications non enregistrées. Cela fonctionne bien, mais il serait agréable de donner à l'utilisateur la possibilité d'annuler l'opération.

7
demandé sur T-and-M Mike 2012-12-05 20:00:36

1 réponses

de l'Application.stop() est last-chance-saloon en d'autres termes bien qu'il piège la sortie, il est un peu tard pour révoquer le processus de sortie.

mieux est de définir un auditeur pour la demande proche qui peut être annulée en consommant l'événement.

dans la classe d'application:

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

et ensuite dans le contrôleur d'application, référencé comme appCtrl ci-dessus:

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

en notant: mainAppPane est référencé dans le FXML (en utilisant le JavaFX Scene Builder dans ce cas ) pour permettre l'accès à la scène et à la fenêtre; la boîte de dialogue est une extension de https://github.com/4ntoine/JavaFxDialog et fileSave est le gestionnaire d'événements pour File -> Save menu item. Pour le Fichier -> Quitter le menu:

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

Espérons que cela aide quelqu'un!

19
répondu T-and-M Mike 2012-12-05 16:00:36