Java 单击按钮后删除GWT中生成的面板

Java 单击按钮后删除GWT中生成的面板,java,gwt,google-gears,Java,Gwt,Google Gears,我正在尝试创建一个同样使用GoogleGears的GoogleWebToolkit(GWT)应用程序,但每次我尝试移除面板时,都会出现一个异常,面板就留在那里 下面是我得到的异常的一个摘录(我只包含了调用堆栈的相关位,其余的只是下降到下面包含的函数中): 我不确定问题出在哪里,但我真的不喜欢在他们批准使用齿轮后把按钮留在那里 我做错了什么?或者有什么建议可以让我用另一种方式来实现它 if(!gearsFactory.hasPermission()) { HorizontalPanel r

我正在尝试创建一个同样使用GoogleGears的GoogleWebToolkit(GWT)应用程序,但每次我尝试移除面板时,都会出现一个异常,面板就留在那里

下面是我得到的异常的一个摘录(我只包含了调用堆栈的相关位,其余的只是下降到下面包含的函数中):

我不确定问题出在哪里,但我真的不喜欢在他们批准使用齿轮后把按钮留在那里

我做错了什么?或者有什么建议可以让我用另一种方式来实现它

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

我发现的一个解决方案是循环“TitleBarlight”面板下的所有小部件,并删除其中包含的所有小部件:

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

但不知何故,这似乎还是有点老套,也不是“正确的方法。”

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

您可以执行以下操作:

theParentWidget.remove(index);

第一个子代对应于0

我知道这很旧,但是

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

不幸的是,这不起作用。removeFromParent()调用位于匿名ClickHandler对象内,因此与rightPanel不在同一范围内。谢谢你的主意!
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();
                            }
                    }
            }
    });