Как очистить RootLayoutPanel в GWT? - PullRequest
1 голос
/ 15 апреля 2010

У меня есть кнопки, прикрепленные к элементам на html-странице точки входа модулей с использованием RootPanel.get("foo").add(button). Если я впоследствии создаю 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. Нажатие «Click Me» открывает панель макета. При нажатии на пинг панели избавляется от панели макета, но кнопка «Click Me» не может быть нажата. Я пробовал разные варианты.

Обновление

Вызов RootPanel.get().remove(RootLayoutPanel.get()) удаляет RootLayoutPanel, очищая LayoutPanel и позволяя активировать виджеты на RootPanel. Однако это приводит к тому, что что-то облажается, потому что любой последующий вызов RootLayoutPanel.get.add() вызывает IndexOutOfBoundsException. Так что это не полный ответ.

Ответы [ 3 ]

4 голосов
/ 15 апреля 2010

Второй вопрос StackOverflow, второй ответ сам. Это плохо?

Итак, первый вызов RootLayoutPanel.get() делает две вещи; создает объект RootLayoutPanel, сохраняя одиночную ссылку на себя, и добавляет себя в RootPanel, вызывая RootPanel.get().add().

Вы можете удалить его, используя RootPanel.remove(RootLayoutPanel.get()), однако это все равно оставит одиночную ссылку на RootLayoutPanel, которая будет возвращена при вызове RootLayoutPanel.get(). Так как это ни к чему не привязано, вы не можете добавить муравейник, не бросая IndexOutOfBoundsException.

Чтобы обойти это, вы можете вручную присоединить RootLayoutPanel к RootPanel с помощью RootPanel.get().add(RootLayoutPanel.get()). Вызов этого, даже если RootLayoutPanel уже подключен, похоже, не приносит никакого вреда ... насколько я могу судить.

0 голосов
/ 15 апреля 2010

Почему вы вообще используете RootPanel?

Вы должны попробовать

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

RootLayoutPanel присоединяется к телу документа (хотя в этом случае он должен прикрепляться к элементу foo). Насколько я знаю, он занимает все доступное пространство на экране (или, если быть более точным - он занимает все пространство в окне браузера).

Таким образом, вы сможете использовать кнопку и панель макета.

0 голосов
/ 15 апреля 2010

Как насчет RootPanel.get().remove(lp1)? (где lp1 - это LayoutPanel из кода выше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...