Динамическое обновление содержимого виджетов GWT Composite

Я создал виджет, который является подклассом Composite и имеет в нем com.extjs.gxt.ui.client.widget.Viewport. В этом окне просмотра я добавил компонент заголовка, компонент LayoutComponent (изначально пустой) и компонент нижнего колонтитула. Я инициализировал составной виджет, вызвав initWidget в конце конструктора, который все настраивает... примерно так (некоторый код удален для удобства чтения):

public class MyComposite extends Composite {
    ... 

    public MyComposite(...) {
        viewport = new Viewport();
        viewport.add(new Header());

        content = new LayoutContainer();
        viewport.add(content);

        viewport.add(new Footer());

        initWidget(viewport);
    }

    public void show(Widget... widgets) {
        content.removeAll();
        for (Widget widget: widgets) content.add(widget);
    }
}

Затем я добавляю экземпляр этого в RootPanel:

MyComposite myComposite = new MyComposite(...);
RootPanel.get("myComposite").add(myComposite);

И знаете что... это работает! Вижу. Показан заголовок, показан нижний колонтитул, а содержимое на данный момент пустое. Хорошо. Затем я звоню, чтобы показать и добавить к нему материал. Не совсем так, а например:

myComposite.show(new Label(...));

Но ничего не происходит. Код запускается, метод add(...) вызывается из метода show(...), исключений нет, но ничего (нового) не появляется. Я не использую метку, но это не проблема (проверено, это работает в других местах). Когда я проверяю DOM в браузере, я вижу, что есть div для содержимого, как и было изначально, но он остался пустым (т.е. без содержимого тела).

Что мне не хватает?

Спасибо!


person Learner    schedule 17.06.2011    source источник
comment
Я также должен отметить, что LayoutContainer — это com.extjs.gxt.ui.client.widget.LayoutContainer, который также работает сам по себе. Я нашел аналогичный вопрос на stackoverflow.com - кто-то расширил какой-то компонент панели, и вообще ничего не появилось, и ему посоветовали вместо этого расширить Composite и фактически содержать панель. Хотя это важные соображения по многим причинам, я не понимаю, почему это должно влиять на то, работает ли эта штука (показывает) вообще!   -  person Learner    schedule 17.06.2011


Ответы (1)


Прежде всего, вы расширяете GWT Composite или GXT Composite? Если это тип GXT, вам нужно будет вызвать initComponent() в области просмотра (а не initWidget), как описано здесь: http://dev.sencha.com/deploy/gxtdocs/com/extjs/gxt/ui/client/widget/Composite.html

Кроме того, попробуйте добавить следующую строку в конец метода show: content.layout(true);

Это заставит GXT разместить содержимое вашего LayoutContainer, и вы, по крайней мере, должны увидеть новые элементы, добавленные в DOM. Если они по-прежнему не отображаются на экране, вам нужно изменить макет вашего LayoutContainer.

person Terrell Plotzki    schedule 17.06.2011
comment
com.google.gwt.user.client.ui.Composite. Сейчас попробую content.layout(true) и дам вам знать. - person Learner; 17.06.2011