任务

时间:2018-05-07 12:50:05

标签: multithreading javafx modal-dialog task modal-window

我的问题是我无法在Task中启动新的模态窗口,它只是没有出去。我不明白怎样才能得出不仅仅是一个allert,而是来自Task的任何模态窗口。由Google翻译=)

Task<Void> task = new Task<Void>() {
            @Override 
            public Void call() throws ApiException,ClientException,InterruptedException {
                 int i = 0;
                 for ( i = 0; i < bufferLenght; i++){
                    try {
                    ...some code
                    }catch(ApiCaptchaException e) {
                       ...get capcha
                       captchaSid = e.getSid();
                       captchaImg = e.getImage();
                       System.out.println( captchaSid);
}

                    System.out.println(captchaSid);
                    if (captchaSid != null) {
                        System.out.println("gg");
                        Alert alert = new Alert(AlertType.INFORMATION);
                        alert.setTitle("Test Connection");
                        //here he is stuck
                        alert.setHeaderText("Results:");
                        alert.setContentText("Connect to the database successfully!");
                        alert.showAndWait();

                        System.out.println("gg3");  
                    if(i<bufferLenght-1) {
                    Thread.sleep(2000);
                    }
                }
                return null;
            }
        };

        new Thread(task).start();

1 个答案:

答案 0 :(得分:0)

您必须在FX应用程序线程上创建并显示新窗口。您可以通过将代码提交到javascript来安排在FX应用程序线程上执行的代码。如果您需要后台线程等待用户解除Platform.runLater(...),您可以使用Alert,如this question中所示:

CompletableFuture

如果您的警报返回了您需要的值,请改用Task<Void> task = new Task<Void>() { @Override protected Void call() throws Exception { // ... CompletableFuture.runAsync(() -> { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Test Connection"); alert.setHeaderText("Results:"); alert.setContentText("Connect to the database successfully!"); alert.showAndWait(); }, Platform::runLater).join(); // ... } }; 并返回lambda表达式中的值。然后,您可以将该值分配给supplyAsync(...)

的结果
join()