JavaFX: Stage / Dialog beenden mit Abfrage

onCloseJavaFX2Der schlimmste Feind des Entwicklers ist und bleibt der Benutzer. Besonders die unerfahrenen Benutzer bringen gerne die UI und die Validierung an ihre Grenzen….
Bestes Beispiel ist ein komplexer Vorgang mit unzähligen Masken, wie eine Bestellung oder eine Installation. Der Benutzer denkt, dass er mit einem „Klick“ auf das „X“ jede Aktion storniert oder auch nicht. Der erfahrene Softwareentwickler fragt an dieser Stelle nochmals mit einem Ja-Nein-Dialog nach:

Wollen Sie wirklich das Programm beenden?

In diesem Blog-Beitrag erkläre ich, wie man so ein Fenster anzeigen kann und wo es eingebunden werden sollte. Ich verwende JavaFX 2.2 und Java 7….

 

Die Hauptanwendung

Nichts besonders, nur ein kleiner Button in der Mitte!

 // kleiner Button
        Button btn = new Button();
        btn.setText("Hallo AxxG-User");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hallo AxxG-User-Btn funktioniert");
                primaryStage.setTitle("Es ist " + new Date());
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hallo AxxG");
        primaryStage.setScene(scene);
        primaryStage.show();

 

Der EventHandler und der Dialog

Hier wird es Interessant. Mit der folgenden Methode fangen wir das Beenden-Event der Oberfläche ab.

primaryStage.setOnCloseRequest();

Innerhalb dieser Methode erstelle ich ein Dialog-Fenster mit einem Label und zwei Buttons.

    primaryStage.setOnCloseRequest(
                new EventHandler<WindowEvent>() {
                    
                    @Override
                    public void handle(WindowEvent event) {
                        //Stage init
                        final Stage dialog = new Stage();
                        dialog.initModality(Modality.APPLICATION_MODAL);

                        // Frage - Label
                        Label label = new Label("Wollen Sie wirklich das Programm beenden?");
                        
                        
                        // Antwort-Button JA
                        Button okBtn = new Button("Ja");
                        okBtn.setOnAction(new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent event) {
                                dialog.close();
                            }
                        });

                        // Antwort-Button NEIN
                        Button cancelBtn = new Button("Nein");
                        cancelBtn.setOnAction(new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent event) {
                                primaryStage.show();
                                dialog.close();
                            }
                        });

 

Das fertige Programm

Wenn man die Teile zusammenfügt, kommt dieses Programm zustande:-)

Die gesamte Klasse

package de.axxg;

import java.util.Date;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

/**
 *
 * @author AxxG
 * @see http://blog.axxg.de
 */
public class WollenSieWirklich extends Application {

    @Override
    public void start(final Stage primaryStage) {
        primaryStage.setOnCloseRequest(
                new EventHandler<WindowEvent>() {
                    
                    @Override
                    public void handle(WindowEvent event) {
                        //Stage init
                        final Stage dialog = new Stage();
                        dialog.initModality(Modality.APPLICATION_MODAL);

                        // Frage - Label
                        Label label = new Label("Wollen Sie wirklich das Programm beenden?");
                        
                        
                        // Antwort-Button JA
                        Button okBtn = new Button("Ja");
                        okBtn.setOnAction(new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent event) {
                                dialog.close();
                            }
                        });

                        // Antwort-Button NEIN
                        Button cancelBtn = new Button("Nein");
                        cancelBtn.setOnAction(new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent event) {
                                primaryStage.show();
                                dialog.close();
                            }
                        });
                        
             
                        
                        // Layout fuer Button
                        HBox hbox = new HBox();
                        hbox.setSpacing(10);
                        hbox.setAlignment(Pos.CENTER);
                        hbox.getChildren().add(okBtn);
                        hbox.getChildren().add(cancelBtn);
                        
                                                
                        // Layout fuer Label und hBox
                        VBox vbox = new VBox();
                        vbox.setAlignment(Pos.CENTER);
                        vbox.setSpacing(10);
                        vbox.getChildren().add(label);
                        vbox.getChildren().add(hbox);
                        
                        
                        // Stage befuellen
                        Scene scene = new Scene(vbox);
                        dialog.setScene(scene);
                        dialog.show();
                    }
                });




        // Start-Stage "normale" Stage befuellen

        // kleiner Button
        Button btn = new Button();
        btn.setText("Hallo AxxG-User");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hallo AxxG-User-Btn funktioniert");
                primaryStage.setTitle("Es ist " + new Date());
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hallo AxxG");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * The main() method is ignored in correctly deployed JavaFX application.
     * main() serves only as fallback in case the application can not be
     * launched through deployment artifacts, e.g., in IDEs with limited FX
     * support. NetBeans ignores main().
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

 

Download

Java Version JDK 1.7.0_07 Inhalt gepacktes Projekt
JavaFX Version 2.2.1 Größe 152 KB
IDE NetBeans IDE 7.2 Endung *.zip
Preis kostenlos Lizenz Creative Commons Lizenzvertrag

JavaFX Wollen Sie Wirklich?

 

Copyright © 2012 AxxG – Alexander Gräsel



Kommentar verfassen