User interface Javafx并发和gui更新

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=新任务(){ @凌驾 受保护的浮点调用()引

我想做的是: 我想在做一些背景工作之前淡入一个覆盖屏幕,并在任务完成时淡出覆盖屏幕

无论如何,java执行后台任务
requestService.doRequest
,然后淡入淡出屏幕。因此,当前的顺序如下:

  • 任务
  • 淡入
  • 淡出
虽然它应该是:

  • 淡入
  • 任务
  • 淡出
我想我尝试了线程、任务、服务等的所有可能配置

那么,如何像我试图实现的那样正确地更新gui呢

Controller.java:

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();

}