2012-05-11 12 views
8

Ho bisogno di ridimensionare popup sulla ridimensionamento della finestra del browser. Ho aggiunto ResizeHandler nel mio costruttore popup, ma dopo diverse funzioni di ridimensionamento del centro del browser() creare un nuovo popup, invece di centrare la corrente. Ecco alcuni codici che ho già provato. Per favore dimmi come risolvere questo o suggerire alcune soluzioni.GWT popup di ridimensionamento e centraggio quando ridimensionamento della finestra del browser

public BigPopup() { 
... 
    final BigPopup self = this; 
     Window.addResizeHandler(new ResizeHandler() {   
      @Override 
      public void onResize(ResizeEvent event) { 
       self.setHeight(getNewHeight()); 
       self.setWidth(getNewWidth()); 
       self.center(); 
      } 
     });  
... 
} 

public BigPopup() { 
... 
     Window.addResizeHandler(new ResizeHandler() {   
      @Override 
      public void onResize(ResizeEvent event) { 
       BigPopup.this.setHeight(getNewHeight()); 
       BigPopup.this.setWidth(getNewWidth()); 
       BigPopup.this.center(); 
      } 
     });  
... 
} 

Aggiunto:

ho creato un progetto semplice che illustra il problema: Classe di Popup

package tesr.client; 

import com.google.gwt.core.client.GWT; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.logical.shared.ResizeEvent; 
import com.google.gwt.event.logical.shared.ResizeHandler; 
import com.google.gwt.uibinder.client.UiBinder; 
import com.google.gwt.uibinder.client.UiField; 
import com.google.gwt.uibinder.client.UiHandler; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.PopupPanel; 
import com.google.gwt.user.client.ui.Widget; 

public class BigPopup extends PopupPanel { 

    private static BigPopupUiBinder uiBinder = GWT 
      .create(BigPopupUiBinder.class); 

    interface BigPopupUiBinder extends UiBinder<Widget, BigPopup> { 
    } 

    @UiField 
    Button tstBtn; 

    @UiHandler("tstBtn") 
    void click(ClickEvent event) { 
     this.hide(); 
    } 

    public int[] getSize() { 
     int[] mas = new int[2]; 
     int x = Window.getClientWidth(); 

     int y = Window.getClientHeight(); 

     if (x >= 1024) { 
      mas[0] = x - 100; 
      mas[1] = y - 100; 
     } else { 
      mas[0] = 1024; 
      mas[1] = 768; 
     } 

     return mas; 
    } 

    public BigPopup() { 
     setWidget(uiBinder.createAndBindUi(this)); 
     Window.addResizeHandler(new ResizeHandler() { 
      @Override 
      public void onResize(ResizeEvent event) { 
       BigPopup.this.setHeight(getSize()[1] + "px"); 
       BigPopup.this.setWidth(getSize()[0] + "px"); 
       BigPopup.this.center(); 
      } 
     }); 
     this.setHeight(getSize()[1] + "px"); 
     this.setWidth(getSize()[0] + "px"); 
     this.setAnimationEnabled(true); 
     this.setGlassEnabled(true); 
     this.setAutoHideEnabled(false); 
    } 

} 

XML per uibinder

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
    xmlns:g="urn:import:com.google.gwt.user.client.ui"> 
    <ui:style> 

    </ui:style> 
    <g:HTMLPanel> 
     <g:Label text="testLabel"></g:Label> 
     <g:Button text="testButton" ui:field="tstBtn"></g:Button> 
    </g:HTMLPanel> 
</ui:UiBinder> 

e classe principale

package tesr.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.RootPanel; 

public class AAA implements EntryPoint { 

    public void onModuleLoad() {  
     Button btn = new Button("Show Popup"); 
     btn.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       BigPopup popup = new BigPopup(); 
       popup.center();    
      } 
     }); 
     RootPanel.get().add(btn); 

    } 
} 

Cosa ho sbagliato? O forse è un bug di GWT?

+0

Funziona per me - Non riesco a riprodurre il problema. Non so, cosa 'getNewWidth()' fa esattamente, e non sono sicuro, quali metodi sovrascrive BigPopup (stai usando un 'com.google.gwt.user.client.ui.PopupPanel', non un' Popup' da Ext-GWT, o qualcosa del genere?) –

+0

getNewWidth() e getNewHeight() restituiscono una stringa come "120px". BigPopup estende PopupPanel. Sono rimasto scioccato quando ho visto questo effetto del metodo center(). il metodo show() ha lo stesso effetto. Non ci sono metodi sottoposti a override nella classe. –

+0

Ho anche provato, funziona senza problemi da nessuna parte. Popup viene creato magicamente quando ridimensiono più volte .. –

risposta

7

Il problema probabilmente non ha nulla a che fare con il ridimensionamento. È proprio questo:

  • Si crea il primo PopupPanel quando si fa clic sul pulsante "Mostra popup".
  • Per questo pannello, si registra un ResizeHandler sulla finestra.
  • Quando si fa clic su "testButton", si nasconde il popup, ma non annullare la registrazione di ResizeHandler.
  • Quindi, quando si fa clic di nuovo su "Mostra popup", viene creato un altro popup con un altro ResizeHandler.

Quindi abbiamo due popup e due ResizeHandlers.

Ora, su ridimensionamento, si chiama 'center()' (che si verifica in entrambi i ResizeHandlers) - che ha l'effetto collaterale, che mostra i popup (se non sono attualmente mostrati). Il primo popup è attualmente rimosso dal DOM, ma GWT è abbastanza intelligente da ricollegarlo. Ma ora li vedi entrambi contemporaneamente.

La soluzione è rimuovere il gestore di ridimensionamento, quando si nasconde il popup.

Ci si potrebbe chiedere, che non esiste il metodo com.google.gwt.user.client.Window.removeResizeHandler(). Funziona un po 'diverso:

private final HandlerRegistration handlerRegistration; 

public BigPopup() { 
    setWidget(uiBinder.createAndBindUi(this)); 
    handlerRegistration = Window.addResizeHandler(new ResizeHandler() {...}); 
    ... 
} 
@UiHandler("tstBtn") 
void click(final ClickEvent event) { 
    handlerRegistration.removeHandler(); 
    this.hide(); 
} 

Si dovrebbe anche fare in modo di disattivare il pulsante "Mostra Popup" mentre è visualizzato il popup.

+1

GWT a volte troppo intelligente, non sempre funziona come ci si aspetta) –

+0

Grazie. Ho avuto lo stesso problema in una sottoclasse self-made di 'DialogBox'. Sovrascrivere il metodo 'hide()' e rimuovere il gestore in quel metodo ha risolto il problema. – Johanna

Problemi correlati