GWT отображение виджетов с асинхронными вызовами на корневой панели

#gwt #asynchronous #widget #panel #asynccallback

#gwt #асинхронный #виджет #панель #обратный вызов asynccallback

Вопрос:

У меня возникли проблемы при добавлении моего виджета в RootPanel другого класса контейнера. Я думаю, что это может быть связано с асинхронным вызовом, который я выполняю во время создания виджета. У меня есть основной класс с именем ImageView, который реализует точку входа. В этом классе я создаю экземпляр моего виджета с именем 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);
     }
}
  

В этом новом виджете я выполняю асинхронный вызов на свой сервер, чтобы получить String ArrayList, который содержит 10 строк, которые ссылаются на путь к файлу 10 разных изображений (т.е. «images/01.jpg «, «images/02.jpg «, и так далее). Я почти уверен, что успешно и корректно получаю эти пути к изображениям. Я произвольно выбрал номер индекса 4 для отображения в моем NewWidget.

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

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

Ответ №1:

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