GWT отображает виджеты с асинхронными вызовами на RootPanel - PullRequest
0 голосов
/ 27 апреля 2011

У меня проблемы с добавлением виджета в 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 различных изображений (например, «images / 01.jpg», «images / 02.jpg» и т. Д.).Я уверен, что я успешно и правильно получаю эти пути изображения.Я произвольно выбрал индекс 4 для отображения в моем NewWidget .

Проблема в том, что я не могу отобразить этот NewWidget на главной панели ImageView .Я могу легко отобразить другие виджеты с этим методом.Со многими попытками я понял, что могу отобразить изображение, если я добавлю строку RootPanel.get().add(mainPanel) в конце NewWidget .Однако я не хочу делать вызов, который ссылается на родительский контейнер (RootPanel в ImageView ).Почему я не могу отобразить это изображение только с помощью его создания на панели контейнера, как я могу отобразить любой другой виджет?Я почти уверен, что это связано с тем, что асинхронный вызов не завершился до того, как я попытался добавить виджет.Но я не знаю, как это исправить.

Я был бы очень рад, если бы люди поделились своими идеями.Спасибо.

1 Ответ

1 голос
/ 27 апреля 2011

Переместите вызов initWidget(mainPanel) на первую строку конструктора.

...