Pracuję nad aplikacją JavaFX, w moim scenariuszu jest pokazany monit hasła utworzony w JavaFX, który przyjmuje hasło z dwiema opcjami OK
i Cancel
. Zwróciłem hasło wprowadzone przez użytkownika.Powrót wynik z javafx platforma runlater
Moja klasa pokazując okno hasło to -
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;
}
Mój kod gdzie pokazać pytanie o hasło jest poniżej, faktycznie ten komunikat zostanie pokazany na innym interfejsie, więc muszę ogrodzić to wewnątrz Platform.runlater()
, inaczej rzuca Not on FX application thread
. Potrzebuję tego hasła, aby wyświetlać się, dopóki nie otrzymam poprawnego. Jak mogę uzyskać wartość hasła, jeśli zamknąłem pokazując hasło wewnątrz runlater.
Czy istnieje inny lepszy sposób?
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(""));
Z jakiegoś dziwnego powodu nie działa zgodnie z oczekiwaniami. Utknął w oczekiwaniu i Runnable.run nigdy nie został wywołany. – xar
To działa dla mnie, dodałem próbkę do wykonania w celu dalszego wykazania użycia. – jewelsea
@xar Prawdopodobnie wywołałeś 'latch.await()' w wątku aplikacji JavaFX, co zablokowałoby twoją aplikację. Dodałem trochę tekstu do odpowiedzi, aby wyjaśnić. – jewelsea