User interface Javafx并发和gui更新
我想做的是: 我想在做一些背景工作之前淡入一个覆盖屏幕,并在任务完成时淡出覆盖屏幕 无论如何,java执行后台任务User interface Javafx并发和gui更新,user-interface,asynchronous,javafx,task,overlay,User Interface,Asynchronous,Javafx,Task,Overlay,我想做的是: 我想在做一些背景工作之前淡入一个覆盖屏幕,并在任务完成时淡出覆盖屏幕 无论如何,java执行后台任务requestService.doRequest,然后淡入淡出屏幕。因此,当前的顺序如下: 任务 淡入 淡出 虽然它应该是: 淡入 任务 淡出 我想我尝试了线程、任务、服务等的所有可能配置 那么,如何像我试图实现的那样正确地更新gui呢 Controller.java: publicsvoiddorequest(请求r){ 任务t=新任务(){ @凌驾 受保护的浮点调用()引
requestService.doRequest
,然后淡入淡出屏幕。因此,当前的顺序如下:
- 任务
- 淡入
- 淡出
- 淡入
- 任务
- 淡出
publicsvoiddorequest(请求r){
任务t=新任务(){
@凌驾
受保护的浮点调用()引发异常{
试一试{
updateProgress(.5f,1);
请求服务.doRequest(r);
}捕获(例外e){
徽章。设置可见(真);
badge.setText(如getMessage());
}最后{
updateProgress(0f,1);
}
返回null;
}
};
overlay.opacityProperty().bind(t.progressProperty());
overlay.opacityProperty().addListener((obs,o,n)->System.out.println(n));
t、 run();
}
顺便说一句:如果我观看overlays opacityProperty的更新,可以看到该属性以正确的顺序更新,但gui刷新似乎挂起。您应该执行
新建线程(t).start()
,或在执行器上执行任务,而不是调用t.run()代码>。如果你这样做会怎么样?谢谢你的建议。我想出了与你不久前建议的相同的解决方案,但忘了发布它。你是对的。如果我使用新的执行器对服务本身调用setExecutor
,服务的任务将在后台执行。
public void doRequest(Request r) {
Task<Float> t = new Task<Float>() {
@Override
protected Float call() throws Exception {
try {
updateProgress(.5f, 1);
requestService.doRequest(r);
} catch(Exception e) {
badge.setVisible(true);
badge.setText(e.getMessage());
} finally {
updateProgress(0f, 1);
}
return null;
}
};
overlay.opacityProperty().bind(t.progressProperty());
overlay.opacityProperty().addListener((obs, o, n) -> System.out.println(n));
t.run();
}