2013-04-10 2 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); 
} 

실행 후, 나는 레이블을 볼 수 없었습니다. 그렇다면 Loading Lebel을 올바르게 보여줄 수있는 적절한 방법은 무엇입니까? 동기 또는 비동기 // a lot of loop here입니다

답변

2

먼저, 어쩌면 당신이 코드의 일부를 게시되지 않은, 당신은 UI에 Label를 추가하고 있는지 확인하지만, 분명히 그것은 onBind

두 번째에 있어야? 비동기식이면 콜백 함수의 끝에서 레이블을 숨겨야합니다.

는 일반적으로 나는 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가 단일 스레드 만 있습니다. 그래서 너는 이렇게 할 수 없어. 당신은 몇 가지 메커니즘을 사용하여 자바 스크립트의 실행을 분할해야합니다. 당신은 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 스케줄러 : –

관련 문제