Les squelettes FXML permettent la définition d'une interface (IHM) graphique sans en spécialiser leur contexte d'utilisation vis-à-vis du "bureau" sous-jacent (système d'exploitation si Windows ou gestionnaire graphique si Linux). Cet article se propose d'exposer une solution pour utiliser une telle interface en tant que boîte de dialogue "modale". Une boîte de dialogue "modale" est une boîte de dialogue exclusive : elle n'autorise pas l'emploi d'une autre interface qu'elle-même au sein de l'application.
Stage stg = new Stage(); // création du fond de fenêtre stg.initOwner(prn); // affectation du conteneur graphique au fond de fenêtre
La méthode ci-dessus fonctionne. Toutefois, la fenêtre "appelante" (souvent la fenêtre principale de l'application) est "suspendue", c'est à dire qu'elle continue à consommer du temps processeur. Pour cette raison, on lui préférera le code qui suit :
Parent prn = FXMLLoader.load(FXMLClassController.class.getResource("FXMLClass.fxml"));
Stage stg = new Stage();
stg.setScene(new Scene(prn));
stg.initOwner(((Node)aev.getSource()).getScene().getWindow()); // aev est l'évènement qui invoque l'affichage de la boîte de dialogue
stg.initModality(Modality.WINDOW_MODAL);
stg.show();La différence se fait essentiellement sur la façon d'afficher la fenêtre et donc également sur le mode "modal". APPLICATION_MODAL interdit la distribution des évènements issus de la boîte de dialogue à tout composant de l'application hors de cette boîte de dialogue. WINDOW_MODAL limite cette interdiction à la fenêtre appelante et aux composants de sa hiérarchie. Dans le premier cas, on place le code de la fenêtre appelante en "attente active" ce qui consomme du temps processeur. Dans le second cas, le code de la fenêtre appelante et mis en sommeil.
Ici nous nous sommes placé dans le cas où la "source" de l'évènement est un nœud (au sens JFX : classe Node ou dérivée) qui retourne un fond d'écran (classe Scene ou dérivée). Si ce n'est pas le cas, il faudra retrouver une référence sur la fenêtre qui invoque la boîte de dialogue. Par exemple, la méthode en fonctionnera pas si l'évènement est produit par un item de menu contextuel.
Rédaction par Jean-Marie Piatte (1983-2021)