【问题标题】:Remove a generated panel in GWT after a button is clicked单击按钮后删除 GWT 中生成的面板
【发布时间】:2009-06-07 22:48:46
【问题描述】:

我正在尝试创建一个也使用 Google Gears 的 Google Web Toolkit (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);
}

【问题讨论】:

    标签: java gwt google-gears


    【解决方案1】:

    我发现的一个解决方案是遍历“titleBarRight”面板下的所有小部件并删除它包含的所有小部件:

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

    但不知何故,这似乎仍然很老套,并不是“正确的做法”。

    【讨论】:

      【解决方案2】:

      我知道这是旧的,但如何...

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

      【讨论】:

        【解决方案3】:

        是否有任何理由使用RootPanel.get("gearsPrompt").removeFromParent(); 而不是您自己的rightPanel.removeFromParent();?参考已经存在。

        【讨论】:

        • 不幸的是,这不起作用。 removeFromParent() 调用位于匿名 ClickHandler 对象内,因此与 rightPanel 不在同一范围内。不过感谢您的想法!
        【解决方案4】:

        你可以这样做:

        theParentWidget.remove(index);
        

        第一个孩子对应0;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-16
          • 1970-01-01
          相关资源
          最近更新 更多