Мне нужно знать, когда VerticalPanel меняет размер

Я использую gwt-dnd для реализации функции перетаскивания в моей программе GWT. Чтобы прокрутка работала правильно, мне нужно

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

Мне нужно вручную установить размер AbsolutePanel, чтобы он был достаточно большим, чтобы содержать VerticalPanel. Однако, когда я добавляю виджеты в VerticalPanel, размер, сообщаемый VerticalPanel.getOffsetHeight (), не обновляется сразу - я думаю, он должен быть сначала обработан браузером. Поэтому я не могу сразу обновить размер AbsolutePanel, и он оказывается слишком маленьким. Ага!

Мое временное решение - установить таймер для изменения размера панели через 500 мс. К тому времени getOffsetHeight обычно будет возвращать обновленные значения. Есть ли способ сразу просмотреть изменение размера или что-то в этом роде? Или, в качестве альтернативы, могу я немедленно вызвать цикл рендеринга, чтобы я мог получить новый размер, не устанавливая таймер, который обязательно будет подвержен ошибкам?


person Riley Lark    schedule 13.10.2010    source источник
comment
Когда вы проверяете новую высоту панели?   -  person Bartek Jablonski    schedule 13.10.2010
comment
Я хотел бы иметь возможность проверить это сразу после добавления нового виджета.   -  person Riley Lark    schedule 14.10.2010


Ответы (1)


Это обычная проблема с манипуляциями с 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);
}
person Gaurav Saxena    schedule 13.10.2010