#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)
вызов в первую строку конструктора.