我正在开发 JavaFX 应用程序,在我的场景中是显示在 JavaFX 中创建的密码提示,该提示需要带有两个选项的密码OK
and Cancel
。我已返回用户输入的密码。
我的显示密码对话框的类别是 -
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;
}
我的显示密码提示的代码如下,实际上这个提示将显示在其他用户界面上,所以我需要将其包含在里面Platform.runlater()
,否则它会抛出Not on FX application thread
。我需要显示此密码提示,直到我得到正确的密码。如果我在 runlater.txt 中包含显示密码,如何获取密码值?
还有其他更好的办法吗?
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(""));
我建议将代码包装在FutureTask
目的。FutureTask
是一种有用的构造(除其他外),用于在一个线程(通常是一个工作线程,在您的情况下是事件队列)上执行部分代码并在另一个线程上安全地检索它。FutureTask#get
将阻塞直到FutureTask#run
已被调用,因此您的密码提示可能如下所示:
final FutureTask query = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
return queryPassword();
}
});
Platform.runLater(query);
System.out.println(query.get());
As FutureTask
实现了Runnable,你可以直接将其传递给Platform#runLater(...)
. queryPassword()
将在事件队列上进行 inokved,并且随后对 get 的调用会阻塞,直到该方法完成。当然,您需要循环调用此代码,直到密码实际匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)