你如何清除GWT中的RootLayoutPanel?

时间:2010-04-15 10:12:27

标签: gwt

我使用RootPanel.get("foo").add(button)在模块入口点html页面上附加了元素。如果我随后创建LayoutPanel并使用RootLayoutPanel.get.add(layoutpanal)附加它,则无法单击按钮。这一切都很好。如果我尝试删除布局面板或清除RootLayoutPanel按钮仍然无法点击。

任何想法如何清除这个?如果您使用了RootPanel,我是否错过了一个步骤,或者您是否应该尝试使用网页RootLayoutPanel

示例代码:

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实施HasClickHandelers。单击“单击我”将打开布局面板。单击面板ping将删除布局面板,但无法单击“单击我”按钮。我尝试了各种选择。

更新

调用RootPanel.get().remove(RootLayoutPanel.get())删除RootLayoutPanel清除LayoutPanel并允许RootPanel上的小部件可点击。但是它确实会导致某些事情搞砸,因为随后对RootLayoutPanel.get.add()的任何调用都会引发错误 IndexOutOfBoundsException。所以这不是完整的答案。

3 个答案:

答案 0 :(得分:4)

第二个StackOverflow问题,我自己的第二个答案。那不好吗?

所以,第一次调用RootLayoutPanel.get()会做两件事;创建一个RootLayoutPanel对象,保持对自身的单例引用,并通过调用RootPanel.get().add()将自身添加到RootPanel。

您可以使用RootPanel.remove(RootLayoutPanel.get())将其删除,但是如果您拨打RootLayoutPanel,这仍然会保留对RootLayoutPanel.get()的单一引用。由于这不附加到任何东西,你不能添加anthing而不抛出IndexOutOfBoundsException

要解决此问题,您可以使用RootLayoutPanel手动将RootPanel重新附加到RootPanel.get().add(RootLayoutPanel.get())。即使RootLayoutPanel已经附加,调用此类似乎也不会造成任何伤害......据我所知。

答案 1 :(得分:0)

RootPanel.get().remove(lp1)怎么样? (其中lp1是上述代码中的LayoutPanel

答案 2 :(得分:0)

为什么要使用RootPanel?

你应该试试

RootLayoutPanel.get("foo").add(button);
RootLayoutPanel.get.add(layoutpanal);

RootLayoutPanel将自身附加到文档正文(尽管在这种情况下它应该附加到foo元素)。据我所知,它占用了屏幕上的所有可用空间(或者更精确 - 它占用了浏览器窗口中的所有空间)。

这样您就可以使用按钮并拥有布局面板。