gpt4 book ai didi

asynchronous - JavaFX 显示加载对话框以进行更长时间的操作

转载 作者:行者123 更新时间:2023-12-04 21:52:03 24 4
gpt4 key购买 nike

我在我的 Controller 类中进行了一些操作,这可能需要一些时间。所以我想在这个操作运行时显示一个加载对话框。

我试过这个:

Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.show();
}
});

Boolean opSuccess = myService.operate();

Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.hide();
}
});

if (opSuccess) {
// continue
}

现在,问题是,loadingDialog 永远不会显示。 UI 只会阻塞一段时间,然后继续“//continue”。

这样看来,runLater 调用被阻塞操作(operate)阻塞了?

我还尝试了 CoundDownLatch,在运行 myService.operate() 之前等待 loadingDialog.show() 完成。但是latch.await() 方法永远不会完成。

所以我的问题是,在 myService.operate() 完成并返回 true 或 false 之前,我如何显示 loadingDialog?我是否必须将操作()调用放入另一个线程并异步运行它还是有更简单的方法?

感谢帮助。

最佳答案

您确定您的整个代码不在 JavaFX 线程中运行吗?
您的 Controller 类的方法通常会这样做,由于您的描述,我认为它是。

但是,最好使用 Task类(class)。 Here您将找到适用于您的应用程序的教程和简短代码段:

// here runs the JavaFX thread
// Boolean as generic parameter since you want to return it
Task<Boolean> task = new Task<Boolean>() {
@Override public Boolean call() {
// do your operation in here
return myService.operate();
}
};

task.setOnRunning((e) -> loadingDialog.show());
task.setOnSucceeded((e) -> {
loadingDialog.hide();
Boolean returnValue = task.get();
// process return value again in JavaFX thread
});
task.setOnFailed((e) -> {
// eventual error handling by catching exceptions from task.get()
});
new Thread(task).start();

我假设 Java 8 和使用 Lambda 表达式的可能性。当然,没有它们也是可能的。

关于asynchronous - JavaFX 显示加载对话框以进行更长时间的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29963542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com