Accueil / Articles PiApplications. / La plate-forme Java / Java FX

Lancement d'une boîte de dialogue FXML.

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.

Méthode la plus simple.

  1. Chargement de l'interface pour la transformer en un conteneur graphique accueillant l'ensemble des composants de l'interface : Parent prn = FXMLLoader.load(FXMLClassController.class.getResource("FXMLClass.fxml"));
    Il s'agit ici de l'exécution d'un interpréteur XML (selon la grammaire FXML) qui transforme les balises et leurs attributs en objets JavaFX.
  2. Affectation du conteneur graphique à une fenêtre JavaFX :
    Stage stg = new Stage(); // création du fond de fenêtre
    stg.initOwner(prn);      // affectation du conteneur graphique au fond de fenêtre
  3. Initialisation de la fenêtre en mode "modal" : stg.initModality(Modality.APPLICATION_MODAL);
  4. Lancement de la fenêtre avec attente de sa fermeture (ou de son masquage) : stg.showAndWait();

Méthode conseillée.

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.

(c) PiApplications 2016