2013-04-10 74 views
1

我得到了一個複雜的循環,可能需要1或2秒來顯示結果,所以我想指出要顯示用戶等待程序完成處理,所以我做了一個標籤(「... loading ... 「)& setVisible在程序開始時爲false &在執行循環之前顯示爲true,然後在循環完成後將setVisible重新設置爲false。GWT,如何正確加載標籤?

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

但運行後,我沒有看到標籤可見。那麼什麼是正確的方式來使加載Lebel正確顯示。

回答

2

首先,檢查你所添加的Label的UI,也許你沒有發佈您的代碼的一部分,但顯然應該在onBind

其次,是// a lot of loop here同步或異步?如果它是異步的,則必須在回調函數結束時隱藏標籤。

通常我喜歡用EventBus,和一個大進程啓動時(無論它是一個同步環,或者某個異步調用鏈)Y調用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)) 

當然,你可以有一個更復雜的加載小部件與這種方法。

1

我認爲你需要循環中顯示某些進展。 Javascript只有單線程。所以你不能這樣做。你必須使用某種機制來分割JavaScript的執行。你可以使用scheduler

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

if(somecodtion) 
{ 
loadingLabel.setVisible(true); 
return false; 
} 
else 
{ 
loadingLabel.setVisible(false); 
return true; 
} 
} 
+0

+1 for scheduler :) –