1

我有一个复杂的循环,可能需要 1 或 2 秒才能显示结果,所以我想指示用户等到程序完成处理,所以我做了一个 Label("...loading..." ) & 在程序开始时将 setVisible 设置为 false 并在执行循环之前将可见设置为 true,然后在循环完成后将 setVisible 设置为 false。

Label loadingLabel=new Label("...loading...");
public void onBind(){
    loadingLabel.setVisible(false);
}
public void onClick(ClickEvent event) {
    loadingLabel.setVisible(true);
    // a lot of loop here
    loadingLabel.setVisible(false);
}

但是运行后,我没有看到可见的标签。那么让Loading Lebel正确显示的正确方法是什么。

4

2 回答 2

2

首先,检查您是否正在向LabelUI添加onBind

二、是// a lot of loop here同步的还是异步的?如果它是异步的,则必须在回调函数的末尾隐藏标签。

通常我更喜欢使用EventBus, 并且当一个大型进程开始时(它是一个同步循环,或者是一个异步调用链) y call eventBus.fire(...),然后当最后一件事完成时,我eventBus.fire(...)再次调用。

 Label loadingLabel = new Label("");
 RootPanel.get().add(loadingLabel);
 loadingLabel.setVisible(false)

 eventBus.addHandler(LoadingEvent.TYPE, new LoadingEvent.Handler() {
   public void onRequestEvent(LoadingEvent ev) {
     if (ev.getMessage() == null) {
        loadingLabel.setVisible(false);
     } else {
        loadingLabel.setText(ev.getMessage());
        loadingLabel.setVisible(true);
     }
   }
 });

 // show the label and display a customized message
 eventBus.fire(new LoadingEvent("message"))

 // a lot of loop here

 // hide the label 
 eventBus.fire(new LoadingEvent(null))

当然,您可以使用这种方法获得更复杂的加载小部件。

于 2013-04-10T08:36:18.233 回答
1

我认为您需要在循环中显示一些进度。Javascript只有单线程。所以你不能这样做。您必须使用某种机制拆分 javascript 的执行。您可以为此使用调度程序

Scheduler.get().scheduleIncremental(new RepeatingCommand() {
                @Override
                public boolean execute() {

if(somecodtion)
{
loadingLabel.setVisible(true);
return false;
}
else
{
 loadingLabel.setVisible(false);
return true;
}
}
于 2013-04-10T08:40:19.503 回答