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

最初にLabel、UI に を追加していることを確認します。コードのその部分を投稿していない可能性がありますが、明らかにそれはonBind

次に、// a lot of loop here同期か非同期か。非同期の場合は、コールバック関数の最後でラベルを非表示にする必要があります。

通常、私は , を使用することを好みEventBus、大きなプロセス (同期ループ、または非同期呼び出しのチェーンのいずれか) が開始されたeventBus.fire(...)ときに y call を使用し、最後の処理が終了したときに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 に答える