2010-12-20 3 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

+0

'GWT.runAsync'를 사용하면 별도의 스크립트로 컴파일된다는 것을 의미합니다.이 스크립트는 원하는 스크립트가 아닐 수도 있습니다. 'DeferredCommand' 또는 GWT 2.1의'Scheduler.get() ... '을 사용하는 것이 더 나을 것입니다. 또는 zOObs가 제안하는대로 프리 페치를 사용하십시오. –

+0

성능상의 이유로 GWT.runAsync를 사용하려고합니다. 기본적으로 많은 작은 이미지 (ClientBundle을 통해로드 됨)가있는 페이지가 있으며 일부 사용자 만이 확대 된 이미지를보기 위해 이곳 저곳을 클릭 할 것으로 예상됩니다. 나는 이미지의 너비/높이가 알려지기 전에 center() 메서드가 호출 된 긴 디버깅 시간을 통해 깨달았다. 그것이 우리가 onLoad 센터가 필요한 이유입니다. 이미지가 현금화 될 수 있기 때문에 onLoad 메서드 외부에 두 번째 센터가 필요합니다. – raisercostin

1

이 문제가 발생했습니다. 센터를 두 번 호출해야하는 이유는 팝업이 "숨겨져있을 때"팝업 컨테이너가 실제로 DOM에서 제거되기 때문입니다. 이미지가로드되었는지 확인할 수 있으려면 팝업이 팝업 내용을 "표시"해야하므로 문제가됩니다.

구현시 권장되는 문제는 이미지가 캐시되지 않은 경우 center()에 대한 첫 번째 호출이 잘못 수행된다는 것입니다. 센터에 두 번째 전화가 걸리면 해결됩니다. 브라우저에서 이것은 팝업 대화 상자가 바뀌게됩니다.

나는 다음을 권장합니다 : 1. 기다리는 회 전자를 동일한 디스플레이에 놓고 초기에 표시하십시오. 2. 하나의 loadHandler가 호출되고, 이미지가 표시되고, 회 전자가 숨겨지고 다시 정렬됩니다.

+0

맞습니다. 이미지가 캐시에서로드되지 않으면 이미지가 잘못된 위치에로드됩니다. 나는 여전히 귀하의 솔루션이 효과가 있다고 생각하지 않습니다. 샘플을 제공해 주시겠습니까? – raisercostin

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

이 도움말을 참조하십시오.

관련 문제