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

时间:2011-01-07 16:44:13

标签: gwt

我有一个SplitLayoutPanel,其中一个子组件是FlowPanel。我已经扩展了FlowPanel来创建ResizableFlowPanel,它实现了ProvideResize和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来观察日志中的值,因为我移动了拆分器,而不是使用断点。这就是我验证getOffsetHeight()继续返回原始大小的方法。

这也验证了为FlowPanel以及子面板调用onResize()。我还尝试向FlowPanel添加一个边框,以查看在拖动SplitLayoutPanel的拆分器时是否发生了更改,并且边框没有改变。

所以这可以改为:为什么实现RequiresResize的SplitLayoutPanel的子实际上不会被调整大小?或者为什么onResize()不会传递新的宽度和高度?

1 个答案:

答案 0 :(得分:3)

我注意到获取窗口小部件的实际宽度可能需要一些时间。 (浏览器可能尚未完成其所有布局工作。) 所以你可能需要在你的onResize()方法中放一个计时器:

    public void onResize() {
        new Timer() {
            @Override
            public void run() {
                int width = ResizeContainer.this.getOffsetWidth();
            }
        }.schedule(100);
    }

或使用延迟调度程序:

    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。