2009-08-06 1 views
6

Come si aggiunge un listener/handler a un VerticalPanel in modo che sia attivato quando VerticalPanel cambia nella dimensione?Aggiunta di listener/handler di ridimensionamento a VerticalPanel in GWT

ho praticamente provato quanto segue:

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

ma il gestore non viene attivato.

risposta

16

Ciò che funziona in modo affidabile è l'ascoltatore a livello di finestra di ridimensionamento:

Window.addResizeHandler(new WindowResizeHandler()) 

vostro gestore di ridimensionamento verrà chiamato quando l'utente ridimensiona la finestra del browser:

public void onResize(ResizeEvent event) 

È possibile utilizzare event.getHeight() e event.getWidth() a ottieni le dimensioni della finestra aggiornate.

Poiché si ottiene l'evento solo per la finestra nel suo complesso, è necessario eseguire la propagazione dei componenti che si desidera disporre. Di solito chiamo solo un metodo doLayout(). Questo metodo non ha nemmeno bisogno dell'altezza e della larghezza dell'evento di ridimensionamento perché, come già commentato da DLH, puoi chiedere la maggior parte dei componenti per le loro dimensioni quando ricevi una notifica e fai i tuoi calcoli con quello.

Sfortunatamente, alcuni browser non fanno la cosa onResize molto spesso. Nel tentativo di non impazzire con gli aggiornamenti, a volte possono rimanere aggrappati all'evento per alcuni secondi, lasciando la tua applicazione visibilmente brutta in attesa di un layout "corretto". Quindi, dove possibile, dovresti provare a lasciare il layout al CSS e, probabilmente, a seconda della tua posizione nelle tabelle "tabelle contro CSS".

5

Il VerticalPanel non genera alcun evento. L'aggiunta di tali eventi non è realmente possibile poiché il browser non supporta gli eventi di ridimensionamento su una tabella (o DIV o quasi qualsiasi elemento HTML di fatto).

Qual è l'effetto che vorresti ottenere? Vuoi ricevere una notifica quando il myPanel viene modificato? allora forse dovresti estendere il VerticalPanel e attivare un evento personalizzato quando i widget vengono aggiunti o rimossi.

+0

In definitiva, voglio ridimensionare il browser in base alle modifiche apportate a VerticalPanel (una sorta di funzione di ridimensionamento automatico che è necessario implementare). Queste modifiche sono principalmente determinate dal ridimensionamento dei widget contenuti in VerticalPanel. Ad esempio, ho un widget TreeGrid con righe comprimibili. Se l'utente espande/comprime una riga, modifica l'altezza del contenitore. Immagino di poter seguire il tuo consiglio ed estendere VerticalPanel per ascoltare le modifiche sui widget che vengono aggiunti. Ma il problema è che non esiste alcuna funzione per ottenere l'altezza del pannello in pixel (almeno a mia conoscenza). – P4ndaman

+0

Basta chiamare getOffsetHeight() dalla classe UIObject per ottenere l'altezza in pixel. – DLH

+0

Heh l'ha appena scoperto, grazie comunque. – P4ndaman