2009-06-07 5 views
0

Google Gears를 사용하는 Google Web Toolkit (GWT) 애플리케이션을 만들려고 시도하지만 패널을 제거하려고 할 때마다 예외 및 패널이 표시됩니다 거기 머물러있다. 여기 버튼을 클릭 한 후 GWT에서 생성 된 패널 제거

내가 얻을 예외에서 발췌 한 것입니다 (난 단지 호출 스택의 관련 비트를 포함 시켰습니다, 나머지는 아래 사항을 포함 된 함수로 내려) :

java.lang.AssertionError: A widget that has an existing parent widget may not be added to the detach list 
    at com.google.gwt.user.client.ui.RootPanel.detachOnWindowClose(RootPanel.java:122) 
    at com.google.gwt.user.client.ui.RootPanel.get(RootPanel.java:197) 

잘 모르겠어요 문제는 무엇입니까,하지만 저는 Gears 사용을 승인 한 후에 버튼을 그대로 두는 것을 좋아하지 않습니다.

내가 뭘 잘못하고 있니? 또는 다른 방법으로 제안하면 작동하도록 만들 수 있습니까? 내가 찾은

if(!gearsFactory.hasPermission()) { 
    HorizontalPanel rightPanel = new HorizontalPanel(); 
    rightPanel.getElement().setId("gearsPrompt"); 
    rightPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); 
    rightPanel.setSpacing(0); 
    rightPanel.setHeight("28px"); 

    InlineLabel enableGearsText = new InlineLabel("Enable Gears for off-line access"); 
    enableGearsText.getElement().setId("gearsText"); 
    enableGearsText.addStyleName("titleElement"); 
    rightPanel.add(enableGearsText); 

    final Button gearsButton = new Button("Use Gears"); 
    gearsButton.getElement().setId("gearsButton"); 
    gearsButton.addStyleName("titleElement"); 
    gearsButton.setHeight("24px"); 

    gearsButton.addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      Factory gearsFactory = Factory.getInstance(); 
      if(gearsFactory != null) { 
       if(gearsFactory.getPermission()) { 
        RootPanel gearsPrompt = RootPanel.get("gearsPrompt"); 
        gearsPrompt.removeFromParent(); 
       } 
      } 
     } 
    }); 

    rightPanel.add(gearsButton); 

    RootPanel titleBarRight = RootPanel.get("titleBarRight"); 
    titleBarRight.add(rightPanel); 
} 

답변

1

하나 개의 솔루션은 "titleBarRight"패널에서 모든 위젯을 통해 루프이며, 포함 된 모든 위젯 제거 :

if(gearsFactory.getPermission()) { 
    RootPanel titleBarRight = RootPanel.get("titleBarRight"); 
    java.util.Iterator<Widget> itr = titleBarRight.iterator(); 
    while(itr.hasNext()) { 
     itr.next(); 
     itr.remove(); 
    } 
} 

을하지만, 어떻게 든이 여전히 해키 보인다 꽤 "올바른 방법".

0

rightPanel.removeFromParent(); 대신 RootPanel.get("gearsPrompt").removeFromParent();을 사용해야하는 이유가 있습니까? 참조는 이미 있습니다.

theParentWidget.remove(index); 

을하고 첫 아이는 0에 해당;

+0

...에 대해이 작동하지 않습니다. removeFromParent() 호출은 익명의 ClickHandler 객체 내부에 있으므로 rightPanel과 동일한 범위에 있지 않습니다. 아이디어를 제공해 주셔서 감사합니다. – Miquella

1

나는이 오래 알고 있지만, 얼마나 불행하게도

gearsButton.addClickHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) { 
        Factory gearsFactory = Factory.getInstance(); 
        if(gearsFactory != null) { 
          if(gearsFactory.getPermission()) { 
            Button btn=(Button) event.getSource(); 
            btn.removeFromParent(); 
          } 
        } 
      } 
    }); 
관련 문제