IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Une Popup modale pour application JavaFX

Pour enrichir les sources JavaFX, un widget utile pour des applications locales : une boîte de dialogue modal, qui s'ouvre tout près de son application-mère, permettant l'acquiescement d'un message ou un choix binaire...

Ecrit en JavaFX, avec décoration en CSS (mais sans utiliser un fichier FXML, le contenu graphique étant simple : une icône, un textArea avec scrolling pour le message, un label pour la consigne et un ou deux boutons pour la réponse utilisateur, quelques touches de couleur...). Le code n'utilise pas les composants natifs Dialog, mais un simple AnchorPane... Le développeur a donc tout sous la main pour faire les modifications qu'il souhaite (La police texte est Verdana, pour un rendu isomorphe sur Windows et Linux (Mac pas testé...).

Tout est dans le zip. Les sources sont dans "src" :
- dans Graphics: les icônes;
- dans genericDialogPopup :
- PostTypes.java, une énumération des 4 types de dialogues (Info, Alerte, Lethal et Choix);
- DialogSTYLE.css, le fichier de déco;
- DialogPoper.java, le code du widget de base (en principe pas directement vu par l'Appli);
- dans chooserDialogPKG :
- ChoosePopup.java, un exemple d'extension de DialogPoper pour donner à l'Appli une popup de choix.
Il y a aussi une image d'une Application (FlightgearGardener) avec la Popup ouverte en mode "Choix" (on peut
la trouver sur https://sourceforge.net/projects/flightgeargardener ).

Le plus simple pour l'utiliser est de compiler les sources (en préservant les répertoires et leurs relations) ; le jar résultant peut alors être placé dans les libraires (classpath) de l'Appli (écrite en JavaFX, bien entendu). Ensuite on l'utilise comme suit :
- Dans le FX Main (là où se trouve la méthode de lancement "public void start(Stage mainStage) throws... }") :
on doit trouver quelque chose comme :
import genericDialogPopupPKG.DialogPoper;
import chooserDialogPKG.ChoosePopup;
...

private ChoosePopup myChooser;
...

@Override
public void start( Stage primaryStage ) throws Exception
{
...

// Popup chooser creation (quelque part après la ligne "mainStage.show();")
myChooser = new ChoosePopup(primaryStage);
...

- Ensuite, l'application peut utiliser un des types de Popup comme suit, par exemple :
- pour un message d'information (theMessage) :
myChooser.resetHintTo("A " + LocalTime.now().format(SHORT_TIME) + ", message reçu ?");
myChooser.postInfo(theMessage);
...
(La Popup apparaît avec une icône verte et un bouton d'acquiescement... ; elle disparaît
au click de ce bouton.)

- pour une alerte :
notifier.resetHintTo("A " + LocalTime.now().format(SHORT_TIME) + " : Alerte reçue ?");
notifier.postAlert(theMessage);
...
(Idem, mais l'icône est un signe de danger, jaune.)

- pour un choix :
boolean answer = false;
notifier.resetHintTo("A " + LocalTime.now().format(SHORT_TIME) + ", faites votre choix :");
answer = notifier.postAsking(theMessage, "YES", "NO") == DialogPoper.YES_ANSWER;
...
(Icône bleue, avec cette fois deux boutons pour marquer le choix...)

Tout peut être modifié, à condition de préserver les relations et la cohérence, bien entendu. La méthode de
sélection du "dropPoint" de la Popup est la seule un peu compliquée, mais on peut évidemment la remplacer
par le placement systématique de la Popup au centre de l'écran principal...

Les sources sont documentées en mode "quasi-FX-débutant", pour faciliter l'accès. Le seul point délicat se
manifeste lorsqu'on utilise la même Popup pour afficher des messages envoyés par plusieurs threads (par exemple
via runLater()), et pas seulement dans le FX-Thread. Les règles à respecter sont :
- Etant un objet graphique, la Popup DOIT être lancée sur le FX-Thread, jamais sur un autre thread ;
- Un "stage" ouvert ("showAndWait()")ne PEUT PAS être ouvert une seconde fois (tant qu'il n'est pas
fermé ("hide()").
Donc, si on a plusieurs thread générant des appels "popup", il faut
- soit leur donner des Popups spécifiques (et gérer l'amoncellement possible de fenêtres...) (non-testé);
- soit sérialiser les appels à une unique Popup, en utilisant une variable du genre "runLaterISLocked",
de type AtomicBoolean, avec quelques judicieux time-out, par exemple...
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.