javafx-2 - 从 javafx 平台运行后返回结果

标签 javafx-2 javafx

我正在开发 JavaFX 应用程序,在我的场景中是显示在 JavaFX 中创建的密码提示,它使用两个选项 OK 获取密码和 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;
    }

我的代码在哪里显示密码提示如下,实际上这个提示会显示在其他 UI 上,所以我需要将它包含在 Platform.runlater() 中, 否则抛出 Not on FX application thread .我需要显示此密码提示,直到我得到正确的提示。如果我在 runlater 中包含显示密码,我如何获得密码的值。

还有其他更好的方法吗?
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());

FutureTask实现Runnable,可以直接传给Platform#runLater(...) . queryPassword()将在事件队列中被调用,随后调用 get 阻塞直到该方法完成。当然,您将希望循环调用此代码,直到密码实际匹配。

关于javafx-2 - 从 javafx 平台运行后返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13796595/

相关文章:

css - 在 javafx 中为背景页面设置覆盖

css - 如何为单个系列条形图添加 3 个图例?? JAVAFX

java - 如何在 JavaFX 中混合 StackedBarChart 和 LineChart?

JavaFX (2.2) 将字符串从内存加载到 WebView 中

java - TextField.bindAutoCompletion 返回对象 ID

javafx工具提示字体收缩

JavaFX SetOnCloseRequest() 关闭所有屏幕

java - 不同阶段的 Controller 和FXML文件之间的连接

recursion - 展开包含所选项目的 TreeView(父)节点

java - Gradle build for 2 platforms : JavaFX and Android. 如何?