Ich arbeite an JavaFX-Anwendung, in meinem Szenario ist eine Passworteingabe in JavaFX erstellt, die Passwort mit zwei Optionen OK
und Cancel
nimmt. Ich habe das vom Benutzer eingegebene Passwort zurückgegeben.Ergebnis der Javafx-Plattform zurückgeben runlater
Meine Klasse Passwort-Dialog zu zeigen ist -
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;
}
Mein Code, in der Passwortabfrage zu zeigen, ist unten, tatsächlich wird diese Aufforderung über andere UI angezeigt werden, so muß ich diese in Platform.runlater()
umschliessen, es anders wirft Not on FX application thread
. Ich brauche diese Passwortaufforderung, um angezeigt zu werden, bis ich die richtige bekomme. Wie kann ich den Wert eines Passworts erhalten, wenn ich das Passwort innerhalb von runlater anzeigen lasse?
Gibt es noch einen besseren Weg?
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(""));
Aus irgendeinem seltsamen Grund funktioniert das nicht wie erwartet. Es blieb bei warten und der Runnable.run wurde nie aufgerufen. – xar
Es funktioniert für mich, fügte ich ein ausführbares Beispiel hinzu, um die Verwendung weiter zu demonstrieren. – jewelsea
@xar Sie haben wahrscheinlich 'latch.await()' im JavaFX-Anwendungsthread aufgerufen, wodurch Ihre App blockiert würde. Ich fügte der Antwort etwas Text hinzu, um es zu erklären. – jewelsea