Retourne le résultat de la plateforme javafx runlater
Je suis en train de travailler sur JavaFX application, dans mon scénario est de montrer une invite de mot de passe créé dans JavaFX qui prend un mot de passe avec l'option deux OK
et Cancel
. J'ai retourné le mot de passe entré par l'utilisateur.
Ma classe de montrer dialogue de mot de passe est -
public static String showPasswordDialog(String title, String message, Stage parentStage, double w, double h) {
try {
Stage stage = new Stage();
PasswordDialogController controller = (PasswordDialogController) Utility.replaceScene("Password.fxml", stage);
passwordDialogController.init(stage, message, "/images/password.png");
if (parentStage != null) {
stage.initOwner(parentStage);
}
stage.initModality(Modality.WINDOW_MODAL);
stage.initStyle(StageStyle.UTILITY);
stage.setResizable(false);
stage.setWidth(w);
stage.setHeight(h);
stage.showAndWait();
return controller.getPassword();
} catch (Exception ex) {
return null;
}
Mon code où pour montrer invite de mot de passe est en dessous, en fait ce message sera affiché sur les autres de l'INTERFACE utilisateur, j'ai donc besoin de inclose présent à l'intérieur de Platform.runlater()
sinon il jette Not on FX application thread
. J'ai besoin de cette invite de mot de passe pour être affichée jusqu'à ce que je l'obtenir correcte. Comment puis-je obtenir la valeur de mot de passe, si j'ai compris montrant mot de passe à l'intérieur de runlater.
Est-il mieux?
final String sPassword = null;
do {
Platform.runLater(new Runnable() {
@Override
public void run() {
sPassword = JavaFXDialog.showPasswordDialog(sTaskName + "Password", "Enter the password:", parentStage, 400.0, 160.0);
}
});
if (sPassword == null) {
System.out.println("Entering password cancelled.");
throw new Exception("Cancel");
}
} while (sPassword.equalsIgnoreCase(""));
source d'informationauteur Neelam Sharma | 2012-12-10
Vous devez vous connecter pour publier un commentaire.
Je vous recommande d'emballage le code à l'intérieur d'un
FutureTask
objet.FutureTask
est une construction utile (entre autres choses) pour l'exécution d'une portion de code sur un fil (généralement un travailleur, dans votre cas, la file d'attente d'événements) et en toute sécurité récupérer sur un autre.FutureTask#get
bloquera jusqu'à ce queFutureTask#run
a été invoquée, par conséquent, votre invite de mot de passe pourrait ressembler à ceci:Comme
FutureTask
implements Runnable, vous pouvez passer directement àPlatform#runLater(...)
.queryPassword()
sera inokved sur la file d'attente des événements, et l'appel suivant pour obtenir bloc jusqu'à ce que la méthode est terminée. Bien sûr, vous voulez appeler ce code dans une boucle jusqu'à ce que le mot de passe correspond en fait à.