Fenêtre modale avec JavaFx

Cette fenêtre modale (Modal window en anglais) permet de verrouiller l'écran et de porter l'attention de l'utilisateur sur le message d'alerte.

L'alerte est affichée au-dessus de la fenêtre en plein écran.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.DialogEvent;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;

/**
 * JavaFX App
 */
public class App extends Application {

	public static void main(String[] args) {
		launch();
	}

	@Override
	public void start(Stage stage) {

		VBox root = new VBox();
		/* Élément racine avec fond noir légèrement transparent */
		root.setStyle("-fx-background: rgba(0,0,0,0.7)");

		Scene scene = new Scene(root, 640, 480);

		stage.setScene(scene);

		/* Scene et fenêtre transparentes */
		scene.setFill(Color.TRANSPARENT);
		stage.initStyle(StageStyle.TRANSPARENT);

		/* Fenêtre en plein écran */
		stage.setFullScreen(true);
		/* Sans le message */
		stage.setFullScreenExitHint("");
		/* Avec aucune touche pour quitter le plein écran */
		stage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH);

		stage.setOnShown(this::onWindowShown);

		/* Montre la fenêtre */
		stage.show();
	}

	/** Quand la fenêtre plein écran s'affiche */
	public void onWindowShown(WindowEvent event) {
		Alert alert = new Alert(AlertType.INFORMATION);
		alert.setTitle("Fenêtre modale");
		alert.setHeaderText("Une fenêtre modale");
		alert.setContentText("Un message important");

		Stage stage = (Stage) event.getSource();

		/* Pour que l'alerte soit associée à cette fenêtre (stage) */
		alert.initOwner(stage);

		/* Montre l'alerte */
		alert.show();

		/* Quand l'alerte se ferme */
		alert.setOnCloseRequest(this::onAlertClosed);

	}

	/** Quand l'alerte est fermée */
	public void onAlertClosed(DialogEvent event) {
		/* Récupération de l'alerte */
		Alert alert = (Alert) event.getSource();

		/* Récupération de la fenêtre */
		Stage stage = (Stage) alert.getOwner();

		/* Réponse de l'utilisateur pour l'alerte */
		System.out.println(alert.getResult());
		stage.close();
	}

}

Résultat :

Commentaires