0

我在将小部件添加到另一个容器类的 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中,我正在对我的服务器进行异步调用以接收一个字符串 ArrayList,其中包含 10 个字符串,这些字符串引用了 10 个不同图像的文件路径(即“images/01.jpg”、“images/02 .jpg”等)。我很确定我成功且正确地接收了这些图像路径。我任意选择了索引号 4 来显示在我的NewWidget中。

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

如果人们愿意分享他们的想法,我将非常高兴。谢谢。

4

1 回答 1

1

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

于 2011-04-26T22:19:13.477 回答