2012-05-11 45 views
8

我需要在瀏覽器窗口大小調整大小彈出窗口。我在彈出式構造函數中添加了ResizeHandler,但是在幾個瀏覽器調整center()函數的大小之後,創建新的彈出窗口,而不是將當前的居中。這裏有一些代碼我已經嘗試過了。 請告訴我如何解決這個問題或提出一些解決方案。當瀏覽器窗口調整大小時,GWT調整大小並居中彈出

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

補充:

我創建了一個簡單的項目,說明了這個問題: 類彈出的

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

和主類

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

    } 
} 

我做錯了什麼?或者,也許這是GWT的錯誤?

+0

它適用於我 - 我不能再現問題。我不知道,getNewWidth()完全是什麼,我不確定,BigPopup覆蓋了哪些方法(您正在使用'com.google.gwt.user.client.ui.PopupPanel',而不是'來自Ext-GWT的Popup,或類似的東西?) –

+0

getNewWidth()和getNewHeight()返回字符串像「120px」。 BigPopup擴展了PopupPanel。當我看到center()方法的這種效果時,我感到震驚。 show()方法具有相同的效果。班級中沒有重寫的方法。 –

+0

我也測試過,它的工作沒有問題沒有地方Popup創建神奇時,我調整了幾次.. –

回答

7

該問題可能根本與調整大小無關。它只是這樣的:

  • 當您單擊「顯示彈出式窗口」按鈕時,創建第一個PopupPanel。
  • 對於此面板,您在窗口上註冊ResizeHandler。
  • 單擊「testButton」時,隱藏彈出窗口,但不取消註冊ResizeHandler。
  • 然後,當您再次單擊「顯示彈出窗口」時,會創建另一個彈出窗口,並與另一個ResizeHandler一起創建。

所以我們有兩個彈出窗口和兩個ResizeHandlers。現在,在調整大小時,您可以調用'center()'(發生在兩個ResizeHandlers中) - 它具有副作用,它顯示彈出窗口(如果它們當前未顯示)。第一個彈出窗口當前與DOM分離,但GWT很聰明,可以重新連接它。但是現在你立即看到它們。

解決方法是在隱藏彈出窗口時刪除調整大小處理程序。

您可能會想知道,沒有com.google.gwt.user.client.Window.removeResizeHandler()方法。它的工作原理有點不同:

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

您還應該確保禁用「顯示彈出」按鈕時會顯示彈出。

+1

GWT有時太聰明,並不總是如你所願地工作) –

+0

謝謝。我在'DialogBox'的自制子類中遇到了同樣的問題。重寫'hide()'方法並刪除該方法中的處理程序解決了這個問題。 – Johanna

相關問題