Мне нужно знать, когда VerticalPanel меняет размер - PullRequest
1 голос
/ 13 октября 2010

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

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

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

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

1 Ответ

2 голосов
/ 13 октября 2010

Это общая проблема с манипуляциями с DOM. Смещение OffHeight не обновляется в течение короткого времени после добавления компонентов. Мне нравится обрабатывать это с помощью рекурсивного таймера, пока не будет нарушено предварительное условие. Например. В вашем случае, пусть будет функция, которая добавляет компоненты и будет определяться следующим образом:

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);
}
...