2010-10-13 38 views
1

我正在使用gwt-dnd在我的GWT程序中實現拖放功能。要獲得滾動的工作權利,我需要我需要知道VerticalPanel何時更改大小

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

我必須手動設置AbsolutePanel的大小要足夠大,以包含VerticalPanel。但是,當我將小部件添加到VerticalPanel時,VerticalPanel.getOffsetHeight()報告的大小不會立即更新 - 我想它必須先由瀏覽器呈現。所以我不能立即更新AbsolutePanel的大小,而且它最終會變得太小。哎呀!

我的解決方案是設置一個計時器,在500ms後調整面板大小。屆時,getOffsetHeight通常會返回更新的值。有什麼辦法可以立即預覽尺寸變化,或者任何事情嗎?或者,也可以立即強制渲染循環,以便我可以在不設置容易出錯的定時器的情況下獲得新的大小?

+0

你什麼時候檢查新的面板高度? – 2010-10-13 16:28:33

+0

我希望能夠在添加新小部件後立即檢查它。 – 2010-10-14 12:52:06

回答

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