我有一个SplitLayoutPanel,其中子组件之一是FlowPanel。我已经扩展了FlowPanel以创建一个实现ProvidesResize和RequiresResize的ResizableFlowPanel,因为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()不传递新的宽度和高度?

最佳答案

我注意到获取小部件的实际宽度可能需要一些时间。 (浏览器可能尚未完成其所有布局工作。)
因此,您可能必须在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。

关于gwt - GWT:在SplitLayoutPanel中执行onResize()时如何获取新大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4627911/

10-10 06:10