我有一个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()不会传递新的宽度和高度?
答案 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。