2012-05-11 19 views
8

Necesito redimensionar ventana emergente en el tamaño de la ventana del navegador. Agregué ResizeHandler en mi constructor emergente, pero después de varias funciones del centro de cambio de tamaño del navegador() creé una nueva ventana emergente, en lugar de centrar la corriente. Aquí algunos codifican lo que ya he intentado. Por favor dígame cómo solucionar esto o sugiera algunas soluciones.GWT cambiar el tamaño y el centro de la ventana emergente cuando el tamaño de la ventana del navegador

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

Agregado:

que creó un proyecto simple que ilustra el problema: Clase de emergente

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 para 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> 

y clase principal

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

    } 
} 

¿Qué estoy haciendo mal? O tal vez es un error de GWT?

+0

Me funciona - No puedo reproducir el problema. No sé, qué 'getNewWidth()' hace exactamente, y no estoy seguro, qué métodos reemplaza BigPopup (está utilizando 'com.google.gwt.user.client.ui.PopupPanel', no' Popup' de Ext-GWT, o algo así?) –

+0

getNewWidth() y getNewHeight() devuelven cadena como "120px". BigPopup amplía PopupPanel. Me sorprendió cuando vi este efecto del método center(). El método show() tiene el mismo efecto. No hay métodos anulados en la clase. –

+0

También he probado, funciona sin problemas en ninguna parte Popup se crea mágicamente cuando redimensioné varias veces .. –

Respuesta

7

El problema probablemente no tiene nada que ver con el cambio de tamaño en absoluto. Es solo esto:

  • Crea el primer PopupPanel al hacer clic en el botón "Mostrar ventana emergente".
  • Para este Panel, usted registra un ResizeHandler en la ventana.
  • Al hacer clic en "testButton", oculta la ventana emergente, pero no anula el registro del ResizeHandler.
  • Luego, cuando hace clic en "Mostrar ventana emergente" nuevamente, se crea otra ventana emergente, con otro ResizeHandler.

Tenemos dos ventanas emergentes y dos ResizeHandlers.

Ahora, al cambiar el tamaño, llama a 'center()' (lo que ocurre en ResizeHandlers) - que tiene el efecto secundario, que muestra las ventanas emergentes (si no se muestran actualmente). La primera ventana emergente está actualmente separada del DOM, pero GWT es lo suficientemente inteligente como para volver a conectarla. Pero ahora los ves a los dos a la vez.

La solución es eliminar el controlador de cambio de tamaño, cuando oculta la ventana emergente.

Puede preguntarse, que no existe el método com.google.gwt.user.client.Window.removeResizeHandler(). Funciona un poco diferente:

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

También debe asegurarse de que el botón "Mostrar ventana emergente" mientras se muestra la ventana emergente.

+1

GWT a veces demasiado inteligente, no siempre funciona como usted espera) –

+0

Gracias. Tuve el mismo problema en una subclase hecha a sí misma de 'DialogBox'. Sobrescribir el método 'hide()' y eliminar el controlador en ese método resolvió el problema. – Johanna

Cuestiones relacionadas