GWT:在SplitLayoutPanel中执行onResize()时如何获得新大小?

GWT:在SplitLayoutPanel中执行onResize()时如何获得新大小?,gwt,Gwt,我有一个SplitLayoutPanel,其中一个子组件是FlowPanel。我已经扩展了FlowPanel来创建一个可调整大小的FlowPanel,它实现了ProvidesResize和RequiresResize,因为FlowPanel有子组件也需要调整大小 拖动SplitLayoutPanel的拆分器时,如何获得子组件的新大小?我尝试在FlowPanel中使用getOffsetWidth()和getElement()。getOffsetWidth,两者都返回原始大小,而不是新大小 我做错了

我有一个SplitLayoutPanel,其中一个子组件是FlowPanel。我已经扩展了FlowPanel来创建一个可调整大小的FlowPanel,它实现了ProvidesResize和RequiresResize,因为FlowPanel有子组件也需要调整大小

拖动SplitLayoutPanel的拆分器时,如何获得子组件的新大小?我尝试在FlowPanel中使用
getOffsetWidth()
getElement()。getOffsetWidth
,两者都返回原始大小,而不是新大小

我做错了什么

下面是我正在尝试的FlowPanel子类:

class ResizableFlowPanel extends FlowPanel implements ProvidesResize, RequiresResize {

    ResizableFlowPanel() {
        super();
    }

    public void onResize() {
        int li_width = this.getOffsetWidth();
        int li_height = this.getOffsetHeight();
        System.out.println("ResizableFlowPanel:: width : " + li_width + "; height: " + li_height);
        for (Widget child : getChildren()) {
            if (child instanceof RequiresResize) {
                ((RequiresResize) child).onResize();
            }
        }
    }
}
我只是添加了System.out,以便在移动拆分器时观察日志中的值,而不是使用断点。这就是我如何验证GetOffsetSight()继续返回原始大小的方法

这还验证是否正在为FlowPanel以及子面板调用onResize()。我还尝试在FlowPanel中添加边框,以查看在拖动SplitLayoutPanel的拆分器时边框是否发生了变化,而边框没有发生变化


因此,这可以重新表述为,为什么实现RequiresResize的SplitLayoutPanel的子级实际上没有被调整大小?或者为什么onResize()不传入新的宽度和高度?

我注意到获取小部件的实际宽度可能需要一些时间。(浏览器可能尚未完成所有布局工作。) 因此,您可能需要在onResize()方法中设置计时器:

或使用延迟计划程序:

    public void onResize() {
            Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
            @Override
            public void execute() {
                int width = ResizeContainer.this.getOffsetWidth();
            }
        });
    }
但是我在没有定时器或调度程序的情况下尝试了你的代码,它工作正常,因此可能是浏览器或gwt版本相关的问题。。。我使用GWT 2.1.1和Firefox 3.6.12。

我通常在小部件附加到文档后覆盖小部件#onLoad()来执行大小计算:
    public void onResize() {
            Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
            @Override
            public void execute() {
                int width = ResizeContainer.this.getOffsetWidth();
            }
        });
    }