2009-06-07 3 views
0

Я пытаюсь создать приложение Google Web Toolkit (GWT), которое также использует Google Gears, но каждый раз, когда я пытаюсь удалить панель, я получаю исключение и панель остается там.Удалите сгенерированную панель в 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(); 
    } 
} 

Но как-то это все еще кажется Hacky и не совсем «правильный способ сделать это».

0

Есть ли причина для использования RootPanel.get("gearsPrompt").removeFromParent(); вместо ваших собственных rightPanel.removeFromParent();? Ссылка уже есть.

+0

К сожалению, не работает. Вызов removeFromParent() находится внутри анонимного объекта ClickHandler и, следовательно, не находится в той же области, что и rightPanel. Спасибо за идею! – Miquella

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