我在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()之前等待loadDialog.show()完成。但是latch.await()方法永远不会完成。
所以我的问题是,我如何显示loadingDialog直到myService.operate()完成并返回true或false?我是否必须将operate()调用放到另一个线程中并异步运行它?或者有更简单的方法吗?
感谢帮助。
您确定整个代码都不会在JavaFX Thread中运行吗?控制器类的方法通常都可以使用,由于您的描述,我认为是可以的。
但是,最好使用Task类。在这里,您将找到您的应用程序的教程和简短代码段:
// 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表达式。当然,没有它们也是可能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句