我在將小部件添加到另一個容器類的RootPanel時遇到問題。我認爲它可能與我在創建窗口小部件期間創建的異步調用有關。我有一個名爲ImageView的主類實現了EntryPoint。在本課中,我通過單擊按鈕創建了一個名爲NewWidget的小部件實例。但是,我不能用傳統的方法顯示出來:GWT在RootPanel上顯示異步調用的小部件
這裏是入口點類(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,我正在對我的服務器進行異步調用以便接收包含10個字符串的字符串ArrayList,該字符串引用10個不同圖像(即「images/01.jpg」,「images/02.jpg」等等)的文件路徑。我非常確定,我成功並正確地接收了這些圖像路徑。我隨意選擇索引號4以顯示在我的NewWidget中。
的問題是,我不能在我的的ImageView主面板中顯示此NewWidget。我可以很容易地用這種方法顯示其他小部件。經過多次嘗試,我意識到如果在NewWidget的末尾添加線RootPanel.get().add(mainPanel)
,我可以顯示圖像。但是,我不想打一個指向父容器的調用(RootPanel在ImageView)。爲什麼我不能僅在我的容器面板中實例化該圖像,就像我可以顯示其他任何窗口小部件一樣?我非常確定,在嘗試添加小部件之前,它與異步調用沒有完成相關。但我不知道如何解決這個問題。
如果有人會分享他們的想法,我會很高興。謝謝。
天哪......我覺得很愚蠢。這解決了它。非常感謝! – yunusual 2011-04-26 22:49:27