2009-08-06 6 views
6

Comment ajouter un écouteur/gestionnaire à un VerticalPanel tel qu'il est déclenché lorsque le VerticalPanel change de taille?Ajout de resize listener/handler à VerticalPanel dans GWT

J'ai essayé essentiellement les éléments suivants:

VerticalPanel myPanel = new VerticalPanel(); 
//... code to add child widgets that may change the size of the parent vertical panel ... 

myPanel.addHandler(new ResizeHandler() { 
    public void onResize(final ResizeEvent event) { 
    //... code to handle resize of vertical panel ... 
    } 

}, ResizeEvent.getType()); 

mais le gestionnaire ne soit pas déclenché.

Répondre

16

Ce qui fonctionne de manière fiable le Redimensionner niveau de la fenêtre d'écoute:

Window.addResizeHandler(new WindowResizeHandler()) 

Votre gestionnaire de modification de taille est appelée lorsque l'utilisateur redimensionne la fenêtre du navigateur:

public void onResize(ResizeEvent event) 

Vous pouvez utiliser event.getHeight() et event.getWidth() à obtenir les dimensions de la fenêtre mise à jour.

Comme vous ne recevez que l'événement pour la totalité de la fenêtre, vous devez effectuer votre propre propagation vers les composants que vous souhaitez mettre en page. D'habitude, j'appelle simplement une méthode doLayout(). Cette méthode n'a même pas besoin de la hauteur et de la largeur de l'événement de redimensionnement car comme DLH le fait déjà, vous pouvez demander à la plupart des composants leurs dimensions lorsque vous êtes averti, et faire vos calculs avec cela.

Malheureusement, certains navigateurs ne font pas très souvent le truc onResize. En essayant de ne pas devenir fou avec les mises à jour, ils peuvent parfois s'accrocher à l'événement pendant quelques secondes, laissant votre application visiblement laide en attendant une mise en page «correcte». Ainsi, si possible, vous devriez essayer de laisser la mise en page CSS et éventuellement, en fonction de votre position dans la guerre "tables vs CSS", des tableaux.

5

Le VerticalPanel ne déclenche aucun événement. L'ajout de ces événements n'est pas vraiment possible puisque le navigateur ne supporte pas les événements de redimensionnement sur une Table (ou DIV ou presque n'importe quel élément HTML).

Quel est l'effet que vous aimeriez obtenir? Voulez-vous être averti lorsque le myPanel est modifié? alors peut-être vous devriez étendre le VerticalPanel et déclencher un événement personnalisé lorsque des widgets sont ajoutés ou supprimés.

+0

En fin de compte, je souhaite dimensionner le navigateur en fonction des modifications apportées au VerticalPanel (une sorte de fonctionnalité de dimensionnement automatique que je dois implémenter). Ces modifications sont principalement dues au redimensionnement des widgets contenus dans VerticalPanel. Par exemple, j'ai un widget TreeGrid avec des lignes réductibles. Si l'utilisateur développe/réduit une ligne, cela modifie la hauteur du conteneur. Je suppose que je pourrais suivre votre conseil et étendre VerticalPanel pour écouter les changements sur les widgets qui sont ajoutés. Mais le problème est qu'il n'y a pas de fonction pour obtenir la hauteur du panneau en pixels (du moins à ma connaissance). – P4ndaman

+0

Vous appelez simplement getOffsetHeight() de la classe UIObject pour obtenir la hauteur en pixels. – DLH

+0

Heh vient de découvrir à ce sujet, merci cependant. – P4ndaman