GWT在RootPanel上显示具有异步调用的小部件

时间:2011-04-26 22:13:27

标签: gwt asynchronous widget panel asynccallback

将我的窗口小部件添加到另一个容器类的RootPanel时遇到问题。我认为它可能与我在创建窗口小部件期间进行的异步调用有关。我有一个名为 ImageView 的主类,它实现了EntryPoint。在本课程中,我通过单击按钮创建名为 NewWidget 的小部件实例。但是,我无法用传统方法显示它:

以下是 EntryPoint 类( ImageView ):

import com.mycompany.project.client.widgets.NewWidget;
public class ImageViewer implements EntryPoint {

public void onModuleLoad() {

    Button b = new Button("Button");
    RootPanel.get().add(b);

    b.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            NewWidget w = new NewWidget();
            RootPanel.get().add(w);
        }
    });
}

这是我的小部件( NewWidget ):

public class NewWidget extends Composite {

     final static DataServiceAsync service = (DataServiceAsync) GWT.create(DataService.class);

     final FlowPanel mainPanel = new FlowPanel();

     public NewWidget() {
         fillImagePath();
     }

     public void fillImagePath(){
     ServiceDefTarget endpoint = (ServiceDefTarget) service;
     endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "data");
         service.getAllDocuments(new AsyncCallback<ArrayList<String>>() {
             @Override
             public void onFailure(Throwable e) {
                 Window.alert("Server call failed.");
             }
             @Override
             public void onSuccess(ArrayList<String> paths) {
                 process(paths);
             }
         });
     }

     public void process(ArrayList<String> paths){
         ArrayList<String> imagePath = paths;
         Image img = new Image(imagePath.get(4));
         mainPanel.add(img);
         initWidget(mainPanel);
     }
}

在这个 NewWidget 中,我正在对我的服务器进行异步调用,以便接收一个String ArrayList,其中包含10个字符串,这些字符串引用10个不同图像的文件路径(即“图像” /01.jpg“,”images / 02.jpg“等等)。我很确定我成功并正确地接收了这些图像路径。我在我的 NewWidget 中随意选择了索引编号4。

问题是我无法在 ImageView 主面板中显示此 NewWidget 。我可以使用此方法轻松显示其他小部件。通过多次尝试,我意识到如果我在 NewWidget 的末尾添加行RootPanel.get().add(mainPanel),我就可以显示图像。但是,我不想进行引用父容器的调用( ImageView 中的RootPanel)。为什么我不能只在我的容器面板中实例化它来显示这个图像,就像我可以显示任何其他小部件一样?在我尝试添加小部件之前,我很确定它与异步调用没有完成有关。但我不知道如何解决这个问题。

如果人们愿意分享他们的想法,我会很高兴。感谢。

1 个答案:

答案 0 :(得分:1)

initWidget(mainPanel)调用移动到构造函数的第一行。