0

私はGWTを初めて使用します。私は、ValueListBox1年の月を表す1から12までの数字をリストするコンボボックス(のインスタンス)を持っている単純なGWTプログラムを書いています。私の要件は、現在の月を画面ロードのコンボに設定することです。クライアント側から今月の値を取得してコンボに設定すれば問題なく動作します。ただし、RPCを使用してサーバー側から当月の値を取得し、コンボに設定すると機能しません。常に変数の初期値を設定します。私の場合、(currentMonth = 0 )サーバーから返された値に関係なく、ゼロです。誰かが私がこれを達成する方法を手伝ってくれますか?

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.text.shared.Renderer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ValueListBox;

public class Sample implements EntryPoint {

    private int currentMonth = 0;

    private final MyServiceAsync service = GWT.create(MyService.class);

    public void onModuleLoad() {

        setCurrentMonth();

        final ValueListBox<Integer> monthCombo = new ValueListBox<Integer>(new Renderer<Integer>() {

            @Override
            public String render(Integer object) {
                return String.valueOf(object);
            }

            @Override
            public void render(Integer object, Appendable appendable) throws IOException {
                if (object != null) {

                    String value = render(object);
                    appendable.append(value);
                }
            }
        });

        monthCombo.setValue(currentMonth);
        monthCombo.setAcceptableValues(getMonthList());

        RootPanel rootPanel = RootPanel.get();
        rootPanel.add(monthCombo);
    }

    private List<Integer> getMonthList() {
        List<Integer> list = new ArrayList<Integer>();

        for (int i = 1; i <= 12; i++) {
            list.add(i);
        }

        return list;
    }

    private void setCurrentMonth() {

        service.getCurrentMonth(new AsyncCallback<Integer>() {

            @Override
            public void onSuccess(Integer month) {
                currentMonth = month;
            }

            @Override
            public void onFailure(Throwable caught) {

            }
        });
    }
}
4

1 に答える 1

5

GWTのRPC呼び出しは非同期です。これは、setCurrentMonth()を呼び出すと、サーバーにリクエストを送信し、すぐに戻ることを意味します。応答が受信されるのを待たずに戻ります。

その結果、onModuleLoad()の残りのコードは onSuccess ()メソッドが呼び出されるに実行される可能性があります。

あなたがやろうとしていることを達成する正しい方法は、onSuccess()メソッド自体からValueListBoxを更新することです。これは、最初にValueListBoxをインスタンス変数にすることで実行できます。次に、onSuccess()で次のことができます。

public void onSuccess(Integer month) {
    monthCombo.setValue(month);
}
于 2012-06-24T19:35:53.647 に答える