将我的窗口小部件添加到另一个容器类的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个不同图像的文件路径(即“图像” /01.jpg“,”images / 02.jpg“等等)。我很确定我成功并正确地接收了这些图像路径。我在我的 NewWidget 中随意选择了索引编号4。
问题是我无法在 ImageView 主面板中显示此 NewWidget 。我可以使用此方法轻松显示其他小部件。通过多次尝试,我意识到如果我在 NewWidget 的末尾添加行RootPanel.get().add(mainPanel)
,我就可以显示图像。但是,我不想进行引用父容器的调用( ImageView 中的RootPanel)。为什么我不能只在我的容器面板中实例化它来显示这个图像,就像我可以显示任何其他小部件一样?在我尝试添加小部件之前,我很确定它与异步调用没有完成有关。但我不知道如何解决这个问题。
如果人们愿意分享他们的想法,我会很高兴。感谢。
答案 0 :(得分:1)
将initWidget(mainPanel)
调用移动到构造函数的第一行。