我的问题是我无法在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();
答案 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()