2009-06-07 47 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

是否有任何理由使用RootPanel.get("gearsPrompt").removeFromParent();而不是自己的rightPanel.removeFromParent();?該參考已經在那裏。

+0

不幸的是不起作用。 removeFromParent()調用位於匿名ClickHandler對象內,因此與rightPanel不在同一範圍內。 感謝您的想法,但! – Miquella 2009-06-08 02:07:47

0

你可以這樣做:

theParentWidget.remove(index); 

和第一個孩子對應於0;

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