2009-06-07 7 views
0

Ich versuche eine Google Web Toolkit (GWT) -Anwendung zu erstellen, die auch Google Gears verwendet, aber jedes Mal, wenn ich versuche, das Panel zu entfernen, erhalte ich eine Ausnahme und das Panel bleibt dort.Ein generiertes Panel in GWT entfernen, nachdem auf eine Schaltfläche geklickt wurde

Hier ein Auszug aus der Ausnahme ist, ich (ich nur die entsprechenden Bits des Call-Stack enthalten haben, senkt sich der Rest ist nur in der mitgelieferten Funktion unten):

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) 

Ich bin nicht sicher Was das Problem ist, aber ich mag es wirklich nicht, den Knopf dort zu lassen, nachdem sie die Verwendung von Gears genehmigt haben.

Was mache ich falsch? Oder irgendwelche Vorschläge zu einer anderen Art, wie ich das tun könnte, damit es funktioniert?

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

Antwort

1

Eine Lösung, die ich gefunden habe, ist durch alle Widgets unter dem „titleBarRight“ Panel Schleife und entfernen Sie alle Widgets enthält:

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

Aber irgendwie scheint dies noch Hacky und nicht ganz der "richtige Weg, es zu tun."

0

Gibt es einen Grund für die Verwendung RootPanel.get("gearsPrompt").removeFromParent(); anstelle Ihrer eigenen rightPanel.removeFromParent();? Die Referenz ist schon da.

+0

Leider funktioniert das nicht. Der Aufruf removeFromParent() befindet sich in einem anonymen ClickHandler-Objekt und befindet sich daher nicht im selben Bereich wie rightPanel. Danke für die Idee! – Miquella

0

Sie tun können:

theParentWidget.remove(index); 

und das erste Kind entspricht 0;

1

Ich weiß, das ist alt, aber wie wäre es ...

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