2010-10-13 5 views
1

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

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

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

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

+0

Когда вы проверяете новую высоту панели? –

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