我有一个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/