如何在GWT中清除RootLayoutPanel?

如何在GWT中清除RootLayoutPanel?,gwt,Gwt,我使用RootPanel.getfoo.addbutton将按钮附加到模块入口点html页面上的元素。如果我随后创建了一个LayoutPanel并使用RootLayoutPanel.get.addlayoutpanal将其附加,则无法单击按钮。这一切都很好。如果我随后尝试删除layoutpanel或清除RootLayoutPanel,按钮仍然无法单击 有没有办法弄清楚这一点?我是否错过了一个步骤,或者如果您使用了RootLayoutPanel,您是否应该永远不要尝试重新使用页面的RootPane

我使用RootPanel.getfoo.addbutton将按钮附加到模块入口点html页面上的元素。如果我随后创建了一个LayoutPanel并使用RootLayoutPanel.get.addlayoutpanal将其附加,则无法单击按钮。这一切都很好。如果我随后尝试删除layoutpanel或清除RootLayoutPanel,按钮仍然无法单击

有没有办法弄清楚这一点?我是否错过了一个步骤,或者如果您使用了RootLayoutPanel,您是否应该永远不要尝试重新使用页面的RootPanel

示例代码:

public void onModuleLoad(){

    final LayoutPanel lp1=new LayoutPanel();

    ClickPanel ping=new ClickPanel("Ping");
    ping.getElement().getStyle().setBackgroundColor( "#fdd" );
    ping.addClickHandler( new ClickHandler(){
        @Override
        public void onClick( ClickEvent event ){
            Window.alert( "Ping!!!" );
            //lp1.removeFromParent();
            //RootLayoutPanel.get().remove(lp1);
            //RootLayoutPanel.get().removeFromParent();
            RootLayoutPanel.get().clear();
        }
    } );

    ClickPanel bong=new ClickPanel("Bong");
    bong.getElement().getStyle().setBackgroundColor( "#ddf" );
    bong.addClickHandler( new ClickHandler(){
        @Override
        public void onClick( ClickEvent event ){
            Window.alert( "Bong!!!" );
        }
    } );

    lp1.add( ping );
    lp1.setWidgetLeftWidth( ping, 100, Style.Unit.PX, 500, Style.Unit.PX );
    lp1.setWidgetTopHeight( ping, 100, Style.Unit.PX, 500, Style.Unit.PX );

    lp1.add( bong );
    lp1.setWidgetLeftWidth( bong, 50, Style.Unit.PCT, 600, Style.Unit.PX );
    lp1.setWidgetTopHeight( bong, 50, Style.Unit.PCT, 200, Style.Unit.PX );

    Button b=new Button("Click Me");
    b.addClickHandler( new ClickHandler(){
        @Override
        public void onClick( ClickEvent event ){
            RootLayoutPanel.get().add( lp1 );
        }
    } );
    RootPanel.get("button1").add( b );
}
ClickPanel只是覆盖HTMLPanel,实现HasClickHandler。单击“单击我”打开布局面板。单击面板ping将删除布局面板,但无法单击“单击我”按钮。我试过各种选择

更新

调用RootPanel.get.removootLayoutPanel.get将删除RootLayoutPanel清除LayoutPanel并允许单击根面板上的小部件。但是,它确实会导致一些事情出错,因为对RootLayoutPanel.get.add的任何后续调用都会抛出
IndexOutOfBoundsException。所以这不是完整的答案。

RootPanel.get.removelp1怎么样?其中lp1是上面代码中的布局面板

RootPanel.get.removelp1如何?其中lp1是上面代码中的布局面板

第二个StackOverflow问题,我自己回答第二个问题。那么糟糕吗

因此,对RootLayoutPanel.get的第一个调用做了两件事;创建一个RootLayoutPanel对象,保留对其自身的单例引用,并通过调用RootPanel.get.add将其自身添加到RootPanel

您可以使用RootPanel.removootLayoutPanel.get删除它,但是这仍然会保留对RootLayoutPanel的单例引用,如果调用RootLayoutPanel.get,将返回该引用。因为它没有附加到任何东西上,所以如果不抛出IndexOutOfBoundsException,就不能添加anthing


要解决此问题,可以使用RootPanel.get.addRootLayoutPanel.get手动将RootLayoutPanel重新连接到RootPanel。即使RootLayoutPanel已连接,调用此选项似乎也不会造成任何伤害。。。据我所知。

第二个问题,第二个答案由我自己回答。那么糟糕吗

因此,对RootLayoutPanel.get的第一个调用做了两件事;创建一个RootLayoutPanel对象,保留对其自身的单例引用,并通过调用RootPanel.get.add将其自身添加到RootPanel

您可以使用RootPanel.removootLayoutPanel.get删除它,但是这仍然会保留对RootLayoutPanel的单例引用,如果调用RootLayoutPanel.get,将返回该引用。因为它没有附加到任何东西上,所以如果不抛出IndexOutOfBoundsException,就不能添加anthing


要解决此问题,可以使用RootPanel.get.addRootLayoutPanel.get手动将RootLayoutPanel重新连接到RootPanel。即使RootLayoutPanel已连接,调用此选项似乎也不会造成任何伤害。。。据我所知。

为什么要使用RootPanel

你应该试试

RootLayoutPanel.get("foo").add(button);
RootLayoutPanel.get.add(layoutpanal);
RootLayoutPanel将自身附加到文档主体,尽管在本例中它应该附加到foo元素。据我所知,它占据了屏幕上的所有可用空间,或者更准确地说,它占据了浏览器窗口中的所有空间


这样,您就可以使用按钮并拥有layoutpanel。

为什么要使用RootPanel

你应该试试

RootLayoutPanel.get("foo").add(button);
RootLayoutPanel.get.add(layoutpanal);
RootLayoutPanel将自身附加到文档主体,尽管在本例中它应该附加到foo元素。据我所知,它占据了屏幕上的所有可用空间,或者更准确地说,它占据了浏览器窗口中的所有空间


这样,您就可以使用按钮和布局面板。

您是否尝试过使用Firebug或类似工具检查DOM?也许RootLayoutPanel还有一些剩余。是的,还有一个div剩余。我可能会直接去修复DOM,但这似乎很脆弱。这是一个bug还是我没有正确使用它?我可以试着把它作为一个bug发布到GWT项目中,看看他们怎么说,但我宁愿先问这个问题;RootPanel.get.removootlayoutpanel.get;但它不起作用。而且RootLayoutPanel.get.clear也不起作用。您是否尝试过使用Firebug或类似工具检查DOM?也许RootLayoutPanel还有一些剩余。是的,还有一个div剩余。我可能会直接去修复DOM,但这似乎很脆弱。这是一个bug还是我没有正确使用它?我可以试着把它作为一个bug发布到GWT项目中,看看他们怎么说,但我宁愿先问这个问题;RootPanel.get.removootlayoutpanel.get;但它不起作用。RootLayoutPanel.get.clear也不起作用。不,那没用。我试了一下,但没想到会有效果。没有,
那没用。我尝试了一下,但并没有真正期望它能工作。我添加了完全相同的问题并使用了该解决方案。它起作用了。但是,我在任何地方都没有找到它的文档。我添加了完全相同的问题并使用了该解决方案。它起作用了。但是,我在任何地方都没有找到它的文档。我不确定您对该代码的预期,但是没有RootLayoutPanel.getfoo这样的方法。至于为什么要使用RootPanel这个问题?控制页面布局的是现有代码。我正在添加一些新内容,希望它占据整个屏幕,然后在我完成后消失。你说得对-rootLayoutPanel.getfoo不存在。我已经登记了文件。我猜问题是因为RootLayoutPanel将自身连接到body元素。我将查看代码,看看到底发生了什么……您是否在gwt项目页面上对此提出了问题?似乎这是因为在删除后立即调用add函数造成的。我已经调试并注意到,如果我在删除一个新的小部件后立即添加一个断点,并在恢复之前等待一秒钟,它就可以正常工作。我的猜测是,在正确传播更改之前需要一段时间。我不确定您对该代码的期望是什么,但是没有RootLayoutPanel.getfoo这样的方法。至于为什么要使用RootPanel这个问题?控制页面布局的是现有代码。我正在添加一些新内容,希望它占据整个屏幕,然后在我完成后消失。你说得对-rootLayoutPanel.getfoo不存在。我已经登记了文件。我猜问题是因为RootLayoutPanel将自身连接到body元素。我将查看代码,看看到底发生了什么……您是否在gwt项目页面上对此提出了问题?似乎这是因为在删除后立即调用add函数造成的。我已经调试并注意到,如果我在删除一个新的小部件后立即添加一个断点,并在恢复之前等待一秒钟,它就可以正常工作。我的猜测是,这一变化需要一段时间才能得到适当传播。