从Composite Widget的构造函数外部调用LayoutPanel.add(child)会导致子元素不会附加到DOM

时间:2011-11-23 21:29:57

标签: gwt mvp mvp4g

我只是想通过公共方法动态地将子项添加到父项。如果我从构造函数内部调用canvasContainer.add(Canvas.createIfSupported()),它会按预期工作,但是从insertLayerAt()方法内部,它会无声地失败,而不会附加到DOM。

我尝试使用不同的Panel作为父元素,使用不同的Widgets作为子元素,但问题仍然存在。

我接近这个错误吗?我找不到任何说我不应该在构造函数外部使用add方法的东西,但是我可能会遗漏一些比这更简单的东西。

我的代码如下,我正在使用GWT 2.4和MVP4G

public class CanvasView extends Composite implements
        CanvasPresenter.ICanvasView {

    LayoutPanel canvasContainer;

    @Inject
    public CanvasView()
    {
        Document document = Document.getInstance();
        Dimension d = document.getDimension();


        canvasContainer = new LayoutPanel();
        canvasContainer.setPixelSize(d.width, d.height);
        canvasContainer.setStyleName("CanvasController");

        initWidget(canvasContainer);


    }

    public void insertLayerAt(int zpos, Layer layer)
    {

        Canvas canvas = Canvas.createIfSupported();
        if (canvas != null)
        {
            GWT.log("Canvas is supported.", null);              
            canvasContainer.add(canvas);

        }else{
            GWT.log("Canvas isn't supported.", null);
        }
    }


}

1 个答案:

答案 0 :(得分:0)

使用延迟命令有时会在有这样的事情时发生,如果原因是有些东西没有完成。我没有尝试过这段代码,所以我不知道它是否适用于这种情况。

public void insertLayerAt(int zpos, Layer layer)
{

    Canvas canvas = Canvas.createIfSupported();
    if (canvas != null)
    {
        GWT.log("Canvas is supported.", null);              
        Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {         
            public void execute() {
                    canvasContainer.add(canvas);
            }
         });
    }else{
        GWT.log("Canvas isn't supported.", null);
    }
}