Javafx: Fermer la boîte d'alerte (ou une boîte de dialogue) par programmation
J'ai un JavaFx application dans laquelle j'affiche une boîte d'alerte à l'aide de:
alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Title");
alert.setHeaderText("Some Text");
alert.setContentText("Choose your option.");
buttonTypeOne = new ButtonType("Yes");
buttonTypeCancel = new ButtonType("No", ButtonData.CANCEL_CLOSE);
alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeCancel);
Optional<ButtonType> result = alert.showAndWait();
Parce que l'alerte s'exécuteshowAndWait
, de sorte qu'il sera affiché jusqu'à l'utilisateur de presse " Oui " ou " Non " ou "Fermer" la boîte de dialogue.
Problème: j'ai besoin de fermer cette boîte de dialogue par programmation à partir d'un autre endroit. D'élaborer, si, disons que l'utilisateur n'a pas choisi une option pour 20 sec, ou disons que cette boîte d'alerte a été montré pour certains processus d'arrière-plan qui a tout juste eu le dessus, et j'aimerais maintenant fermer cette boîte d'alerte par la mise en result
être buttonTypeCancel
, à la place de l'utilisateur en appuyant sur un bouton.
(Comme dispose
méthode de Swing)
Comment puis-je faire cela? J'ai essayé de l'Événement.fireevent (https://stackoverflow.com/a/22459308/3155986) mais je ne suis pas capable d'écrire le bon événement associé.
Merci d'avance!
Edit: y Compris les exemples de code-
- MainApp.java - la classe Java responsable du traitement de la demande
- Controller.java - contrôleur Correspondant fichier
- De conception.fxml - FXML fichier de l'application, qui est chargé par MainApp.java et contrôlé par Controller.java
- Compute.java - une Autre classe java pour effectuer des calculs.
public class Calcul{
Alerte alerte;public void function1{ Platform.runLater(new Runnable(){ public void run(){ alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("Title"); alert.setHeaderText("Some Text"); alert.setContentText("Choose your option."); buttonTypeOne = new ButtonType("Yes"); buttonTypeCancel = new ButtonType("No", ButtonData.CANCEL_CLOSE); alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeCancel); Optional<ButtonType> result = alert.showAndWait(); if (result.get() == buttonTypeOne){ //... user chose "One" } else { //... user chose CANCEL or closed the dialog } } }); } public void function2{ //......Does some long computation here //.... If the computation finishes before the user chooses 'Yes' or 'No' on alert box //...Then close the alertbox here and execute the code corresponding to buttonTypeCancel //..I tried alert.close(); and alert.hide(); but doesn't work. }
}
Aussi, est-il une solution alternative pour ce faire? A l'origine, je voulais garder la Compute.java
propre de toute javafx code, mais ne pouvait pas comprendre comment.
Window
(Stage
) ou Alert
(Dialog
), vous pouvez invoquer .close() de deux d'entre eux.J'ai essayé .close()/ .hide() pour l'alertbox, mais il n'est pas exécuté. Je souhaite effectuer le code pour
buttonTypeCancel
lorsque l'alertbox est fermé forecefully de quelque chose de javacode.OriginalL'auteur Dilpreet Kaur | 2015-06-10
Vous devez vous connecter pour publier un commentaire.
Essayer cette
Ou pour plus d'général
Exemple complet:
buttonTypeCancel
est exécutée.vous avez eu raison. Mis à jour.
Cela ne fonctionne pas non plus. Et dans le code, il devrait être
if ( bt.getButtonData() == ButtonData.CANCEL_CLOSE )
.ButtonData est un enum défini dans ButtonBar, de sorte qu'il est question de la façon dont vous importez les classes. Le ButtonBar.ButtonData.CANCEL_CLOSE devrait marcher, car il est un package complet de chemin.
Il fixe. Comme je suis en invoquant l'alertbox dans
Platform.runLater()
, de la même manière, j'ai dû invoquer l'alerte.close() dansPlatform.runLater()
. Dans tous, à invoquer tout ce qui est lié à l'interface graphique à l'extérieur de MainApp.java, utilisezPlatform.runLater().
OriginalL'auteur Uluk Biy
Vous pouvez invoquer
close()
méthode sur l'Alerte ou de tout Dialogue.Voici un exemple simple qui attend 5 secondes, et si l'Alerte est toujours à l'affiche, elle le ferme.
Bien sûr, vous pouvez,
PauseTransition
être une meilleure option à mon humble avis. Cette solution a été d'une approche générique, vous pouvez toujours remplacer le fil avec ce que vous voulez 🙂Merci, PauseTransition est bon. J'ai remarqué que l'alerte.close() ne fonctionne que si vous avez un type de bouton avec ButtonData.CANCEL_CLOSE ou manuellement alerte d'appel.setResult premier. Aussi, il y a des boutons prédéfinis pour "Oui", "Non", etc (ButtonType.OUI, ButtonType.N°...), mais si j'utilise celles-ci, il les met dans un drôle de commande et met en évidence l'un d'eux (le bouton OUI). Ressemble ButtonBar n'est que sur la base des ButtonData valeurs.
OriginalL'auteur ItachiUchiha
C'est la fermeture ouvert dialogue en 2 seconde.
OriginalL'auteur Gulu Bulu