我正在使用gwt-dnd在我的GWT程序中实现拖放功能。为了使滚动工作正常,我需要
<ScrollPanel>
<AbsolutePanel>
<VerticalPanel>
<!-- lots of draggable widgets -->
</VerticalPanel>
</AbsolutePanel>
</ScrollPanel>
我必须手动将AbsolutePanel的大小设置为足够大以包含VerticalPanel。但是,当我向VerticalPanel添加小部件时,VerticalPanel.getOffsetHeight()报告的大小不会立即更新 - 我想它必须首先由浏览器呈现。所以我无法立即更新AbsolutePanel的大小,最终它太小了。哎呀!
我的止损解决方案是设置一个计时器,以便在500毫秒后调整面板的大小。到那时,getOffsetHeight通常会返回更新的值。有没有办法立即预览尺寸变化,或任何东西?或者,我可以立即强制渲染循环,这样我就可以获得新的大小,而不需要设置一个容易出错的计时器吗?
答案 0 :(得分:2)
这是DOM操作的常见问题。 offsetHeight在添加组件后的短时间内不会更新。我喜欢使用递归计时器来处理这个问题,直到违反前提条件。例如。在你的情况下,让我们有一个添加组件的功能,定义如下:
public void addComponent(Widget w)
{
final int verticalPanelHeight = verticalPanel.getOffsetHeight();
verticalPanel.add(w);
final Timer t = new Timer(){
public void run()
{
if(verticalPanelHeight != verticalPanel.getOffsetHeight())
absolutePanel.setHeight(verticalPanel.getOffsetHeight() + 10 + "px");
else
this.schedule(100);
}
};
t.schedule(100);
}