0

我是 GWT 的新手。我正在编写一个简单的 GWT 程序,其中有一个组合框( 的一个实例ValueListBox),其中列出了从 1 到 12 的数字,代表一年中的月份。我的要求是将当前月份设置为屏幕加载的组合。如果我从客户端获取当前月份的值并将其设置为组合,它工作正常。但是,如果我使用 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 回答