Javascript GWT PopupPanel未在正确的时间显示

Javascript GWT PopupPanel未在正确的时间显示,javascript,gwt,Javascript,Gwt,我有一个只需点击一个按钮就可以调用的函数,创建一些元素并将其附加到DOM中需要很长时间,因此我希望在函数完成它必须完成的操作时显示一个带有“加载”图标的PopupPanel。请注意,我的函数不调用服务器,它只在UI中创建一些需要很长时间计算的元素,因此我没有onSuccess()事件或回调函数 functionWhichTakesaLongTimeToExecute(); pp.show(); pp.hide(); 所以我有我的PopupPanel: pp

我有一个只需点击一个按钮就可以调用的函数,创建一些元素并将其附加到DOM中需要很长时间,因此我希望在函数完成它必须完成的操作时显示一个带有“加载”图标的PopupPanel。请注意,我的函数不调用服务器,它只在UI中创建一些需要很长时间计算的元素,因此我没有onSuccess()事件或回调函数

functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();
所以我有我的PopupPanel:

pp = new PopupPanel();
pp.setTitle("loading....");
pp.setGlassEnabled(true);
functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();
然后在单击处理程序上,我有以下代码:

public void onClick(ClickEvent event) {
  pp.show();
  functionWhichTakesaLongTimeToExecute();               
  pp.hide();
}
functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();
由于JavaScript是单线程的,我希望弹出窗口会出现,然后执行MakeSalongTimeExecute()的函数,然后隐藏弹出窗口,但发生的是首先执行MakeSalongTimeExecute()的函数,需要很长时间才能将元素附加到DOM中,只有在完成工作后,弹出窗口才会显示,然后隐藏。 就好像代码是:

functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();
更让我困扰的是,如果我在pp.show()之后添加Window.alert(“test”),这将中断流程,直到按下警报中的OK按钮,这将导致弹出窗口出现在警报之前以及调用MakeSalongTimeExecute()的函数之前。 因此,以下代码按预期工作:

functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();
pp.show();
Window.alert("test");
functionWhichTakesaLongTimeToExecute();                 
pp.hide(); 
有人能给我解释一下为什么在调用函数MakeSalongTimeExecute()之前不显示弹出窗口,而是“等待”函数MakeSalongTimeExecute()执行,然后才显示,为什么添加一个Window.alert(“test”)会使其正确显示?

PS:我已经在IE8和Chrome中测试了代码,其行为是相同的。

这就是你可以做到的:

functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();
pp.show();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {

    @Override
    public void execute() {
        functionWhichTakesaLongTimeToExecute();
        pp.hide();
    }
});

我在这里解释:

我在使用setGlassEnabled时也遇到了一些问题。是否可以通过从代码中删除setGlassEnabled(true)行进行检查,看看它是否有效

functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();
还有一件我碰巧注意到的事情是,您没有向PopupPanel添加任何小部件。在PopupPanel的源代码中提到,在调用show之前,必须将子小部件附加到PopupPanel对象。

functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();

请尝试这两种方法,并让我知道其中一种是否有效。

作为补充说明,我构建了一些非常复杂的UI,它们的构建时间从不超过100毫秒。您可能想了解为什么UI需要如此长的时间才能呈现。一定有一些方法可以优化它。我尝试了你的代码,但没有成功。然而,我设法用定时器来做我需要的事情。Timer tmr=new Timer(){@Override public void run(){functionWhichTakesaLongTimeToExecute();pp.hide();}}};tmr.附表(100);通过将标签添加到PopupPanel并启用SetGlass(错误)来尝试。仍然无法使用调度程序。但是它可以与Timer类解决方案一起工作。
functionWhichTakesaLongTimeToExecute(); 
pp.show();                  
pp.hide();