2010-12-20 56 views
4

我使用gwt彈出來顯示一些消息,但如果我調用popup.center(),它不會顯示在顯示事件的 中心 中。其實它不是第一次居中 ,如果我關閉它並再次打開它,每一件事情都可以, 但不是第一次。如何解決這個問題?gwt彈出不居中

GWT.runAsync(new RunAsyncCallback() { 
    @Override 
    public void onSuccess() { 
     Image fullImage = new Image(optionImageName); 
     fullImage.setAltText("Loading image ..."); 
     imagePopup.setWidget(fullImage); 
     imagePopup.center(); 
    } 
}); 

我在http://www.devcomments.com/gwt-Popup-is-not-centered-at107182.htm上發現了這個問題,今天我也遇到了這個問題。我找到了答案,我會在這裏發佈以供將來參考。

回答

2

我發現問題在於當您彈出中心時圖像未加載完成。這只是第一次發生,因爲第二次圖像以某種方式被瀏覽器兌現。

解決方案是將它集中在onLoad事件上。

GWT.runAsync(new RunAsyncCallback() { 
    @Override 
    public void onSuccess() { 
     Image fullImage = new Image(optionImageName); 
     fullImage.setAltText("Loading image ..."); 
     fullImage.addLoadHandler(new LoadHandler() { 
      @Override 
      public void onLoad(LoadEvent event) { 
       imagePopup.center(); 
      } 
     }); 
     imagePopup.setWidget(fullImage); 
     imagePopup.center(); 
    } 
}); 
+0

曾嘗試預取圖像('Image.prefetch(String)')? – z00bs 2010-12-20 08:11:28

+0

使用'GWT.runAsync'將意味着它將被編譯成一個單獨的腳本,這可能不是你想要的。最好使用'DeferredCommand'或GWT 2.1的'Scheduler.get()...'。或者按照zOObs的建議使用預取。 – 2010-12-20 10:11:45

+0

出於性能方面的原因,使用GWT.runAsync。基本上我有一個頁面上有許多小圖片(通過ClientBundle加載),我希望只有一些用戶點擊這裏和那裏看到一個縮放圖像。我通過很長的調試時間實現了center()方法被調用,然後才知道圖像的寬度/高度。這就是爲什麼我們需要一個onLoad中心。我們需要onLoad方法之外的第二個中心,因爲圖像也可能是兌現的。 – raisercostin 2011-01-03 20:18:40

1

我也有這個問題。您必須呼叫中心兩次的原因是因爲當彈出窗口被「隱藏」時,彈出窗口容器實際上已從DOM中移除。這是有問題的,因爲彈出窗口現在必須「顯示」彈出窗口的內容,然後才能檢查圖像是否已加載。

建議的實現問題是,如果圖像沒有被緩存,第一次調用center()將會不正確地完成。第二次打電話給中心會糾正它。在瀏覽器上,這導致了彈出對話框的移動(這看起來很糟糕)。

我會推薦以下內容: 1.將一個等待微調器放入同一顯示器中並顯示最初。 2.調用一個loadHandler,顯示圖像,隱藏微調器和中心。

+0

是的你是對的,如果圖像沒有從緩存中加載,圖像被加載到錯誤的位置。我仍然認爲你的解決方案不會起作用。你能提供樣品嗎? – raisercostin 2011-02-28 20:11:48

0
public void onClick(ClickEvent event) { 
      // TODO Auto-generated method stub 
      final ADPopup popup = new ADPopup(); 
      popup.setHeight("300px"); 
      popup.setWidth("500px"); 
      popup.setPopupPositionAndShow(new PopupPanel.PositionCallback() { 

       public void setPosition(int offsetWidth, int offsetHeight) { 
        // TODO Auto-generated method stub 
        int left = (Window.getClientWidth() - offsetWidth)/3; 
        int top = (Window.getClientHeight() - offsetHeight)/3; 

        popup.setPopupPosition(left, top); 
       } 
      }); 

      popup.show(); 
     } 

希望這個幫助。