2010-10-13 24 views
1

J'utilise gwt-dnd pour implémenter la fonctionnalité glisser-déposer dans mon programme GWT. Pour obtenir le défilement à travailler à droite, je doisJe dois savoir quand un VerticalPanel change de taille

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

Je dois régler manuellement la taille de la AbsolutePanel être assez grand pour contenir la VerticalPanel. Cependant, lorsque j'ajoute des widgets au VerticalPanel, la taille indiquée par VerticalPanel.getOffsetHeight() n'est pas immédiatement mise à jour - je suppose que cela doit d'abord être rendu par le navigateur. Donc, je ne peux pas immédiatement mettre à jour la taille de l'AbsolutePanel, et il finit par être trop petit. Argh!

Ma solution d'arrêt est de configurer une minuterie pour redimensionner le panneau 500ms plus tard. D'ici là, getOffsetHeight retournera généralement les valeurs mises à jour. Est-il possible de prévisualiser immédiatement le changement de taille, ou quoi que ce soit? Ou, alternativement, puis-je forcer une boucle de rendu immédiatement afin que je puisse obtenir la nouvelle taille sans mettre en place une minuterie qui risque d'être sujette aux erreurs?

+0

Quand vérifiez-vous la nouvelle hauteur du panneau? –

+0

J'aimerais pouvoir le vérifier immédiatement après avoir ajouté un nouveau widget. –

Répondre

2

Ceci est un problème courant avec les manipulations DOM. La propriété offsetHeight ne se met à jour que peu de temps après l'ajout des composants. J'aime gérer cela en utilisant une minuterie récursive jusqu'à ce qu'une condition préalable soit violée. Par exemple. Dans votre cas, laissez une fonction qui ajoute des composants et qui sera définie comme suit:

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