2012-05-11 13 views
8

मुझे ब्राउज़र विंडो आकार बदलने पर पॉपअप का आकार बदलने की आवश्यकता है। मैंने अपने पॉपअप कन्स्ट्रक्टर में ResizeHandler जोड़ा, लेकिन कई ब्राउज़र आकार बदलने केंद्र() फ़ंक्शन के बाद वर्तमान को केंद्रित करने के बजाय, नया पॉपअप बनाएं। यहां कुछ कोड जो मैंने पहले ही कोशिश की है। कृपया मुझे बताएं कि इसे कैसे हल करें या कुछ समाधान सुझाएं।ब्राउज़र विंडो का आकार बदलने पर जीडब्ल्यूटी का आकार बदलना और पॉपअप केंद्रित करना

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

} 

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

    } 
} 

मैं क्या गलत कर रहा हूं? या शायद यह जीडब्ल्यूटी की बग है?

+0

यह मेरे लिए काम करता है - मैं समस्या को पुन: उत्पन्न नहीं कर सकता। मुझे नहीं पता, क्या प्राप्त होता है न्यूविड्थ() 'वास्तव में करता है, और मुझे यकीन नहीं है कि बिगपॉप ओवरराइड किस तरीके से है (आप' com.google.gwt.user.client.ui.PopupPanel' का उपयोग कर रहे हैं, न कि ' Ext-GWT से पॉपअप ', या ऐसा कुछ?) –

+0

getNewWidth() और getNewHeight() वापसी स्ट्रिंग जैसे "120px"। BigPopup PopupPanel फैलाता है। जब मैं केंद्र() विधि के इस प्रभाव को देखा तो मैं चौंक गया। शो() विधि का एक ही प्रभाव है। कक्षा में कोई ओवरराइड विधियां नहीं हैं। –

+0

मैंने यह भी परीक्षण किया है, यह बिना किसी समस्या के काम करता है, जब भी मैं कई बार आकार बदलता हूं तो पॉपअप जादूगर रूप से बनाया जाता है .. –

उत्तर

7

समस्या का आकार बदलने के साथ कुछ भी नहीं है। यह सिर्फ यह है:

  • जब आप "पॉपअप दिखाएं" बटन पर क्लिक करते हैं तो आप पहले पॉपअपपैनल बनाते हैं।
  • इस पैनल के लिए, आप विंडो पर ResizeHandler पंजीकृत करते हैं।
  • "testButton" पर क्लिक करते समय, आप पॉपअप को छुपाते हैं, लेकिन ResizeHandler को अनधिकृत नहीं करते हैं।
  • फिर, जब आप फिर से "पॉपअप दिखाएं" पर क्लिक करते हैं, तो दूसरा पॉपअप बनाया जाता है, एक और ResizeHandler के साथ।

तो हमारे पास दो पॉपअप हैं, और दो ResizeHandlers हैं।

अब, आकार बदलने पर, आप 'सेंटर()' (जो कि ResizeHandlers दोनों में होता है) को कॉल करें - जिसका दुष्प्रभाव है, यह पॉपअप दिखाता है (यदि वे वर्तमान में दिखाए नहीं गए हैं)। पहला पॉपअप वर्तमान में डीओएम से अलग है, लेकिन जीडब्ल्यूटी इसे पुनः संलग्न करने के लिए पर्याप्त स्मार्ट है। लेकिन अब आप उन्हें एक साथ दोनों देखते हैं।

समाधान जब आप पॉपअप को छुपाते हैं तो आकार बदलने वाले हैंडलर को निकालना है।

आप सोच सकते हैं कि 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

धन्यवाद। मुझे 'डायलॉगबॉक्स' के स्वयं निर्मित उप-वर्ग में एक ही समस्या थी। 'छुपाएं) विधि को ओवरराइड करना और उस विधि में हैंडलर को हटाने से समस्या हल हो गई। – Johanna

संबंधित मुद्दे