我需要知道VerticalPanel何时改变大小

时间:2010-10-13 15:59:14

标签: gwt drag-and-drop resize rendering

我正在使用gwt-dnd在我的GWT程序中实现拖放功能。为了使滚动工作正常,我需要

<ScrollPanel>
    <AbsolutePanel>
        <VerticalPanel>
             <!-- lots of draggable widgets -->
        </VerticalPanel>
    </AbsolutePanel>
</ScrollPanel>

我必须手动将AbsolutePanel的大小设置为足够大以包含VerticalPanel。但是,当我向VerticalPanel添加小部件时,VerticalPanel.getOffsetHeight()报告的大小不会立即更新 - 我想它必须首先由浏览器呈现。所以我无法立即更新AbsolutePanel的大小,最终它太小了。哎呀!

我的止损解决方案是设置一个计时器,以便在500毫秒后调整面板的大小。到那时,getOffsetHeight通常会返回更新的值。有没有办法立即预览尺寸变化,或任何东西?或者,我可以立即强制渲染循环,这样我就可以获得新的大小,而不需要设置一个容易出错的计时器吗?

1 个答案:

答案 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);
}