У меня проблемы с добавлением виджета в 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 ).Почему я не могу отобразить это изображение только с помощью его создания на панели контейнера, как я могу отобразить любой другой виджет?Я почти уверен, что это связано с тем, что асинхронный вызов не завершился до того, как я попытался добавить виджет.Но я не знаю, как это исправить.
Я был бы очень рад, если бы люди поделились своими идеями.Спасибо.