GWTP, SmartGWT, Ошибка при добавлении виджета GWT в SmartGWT

Я использую GWT 2.4, SmartGWT 3.0, GWTP 0.7.

Я в основном стараюсь придерживаться виджетов SmartGWT для своего макета, но я пытаюсь добавить виджет GWT (может быть что угодно, от MapWidget до ChartWidget из HighCharts или метки GWT) на вкладку в наборе вкладок SmartGWT. Тогда получается следующее исключение:

Caused by: java.lang.AssertionError: A widget that has an existing parent widget may not be added to the detach list

Это происходит только в режиме разработки. В процессе производства утверждения были отключены, и мои виджеты действительно отображаются, но это делает невозможным отладку в режиме разработки. Насколько я понимаю, это потому, что я смешиваю виджеты SmartGWT и GWT.

До GWTP я мог выполнять эту работу, потому что, чтобы показать свой пользовательский интерфейс, я вызывал draw() в моем корневом макете, который был VLayout. Теперь, когда я использую GWTP, он покажет мне мой макет, когда я запускаю RevealRootContentEvent, и он добавит макет, вызвав RootPanel.get().add(...), что, я думаю, является причиной того, что у меня сейчас эти проблемы. Все мои макеты все еще в SmartGWT.

Кто-нибудь испытывал те же проблемы (в той же настройке), и как с этим справиться?


person Rasmus Nielsen    schedule 25.07.2012    source источник
comment
разве вы не можете избавиться от RootPanel.get().add() и просто использовать метод draw? Ваша проблема напрямую связана с RootPanel.get().add() вызовом   -  person Jean-Michel Garcia    schedule 25.07.2012
comment
Я не вызываю RootPanel.get (). Add () напрямую. Это делается в GWTP RootPresenter.setInSlot. Я предполагаю, что вы предлагаете клонировать источник GWTP и создать свою собственную версию?   -  person Rasmus Nielsen    schedule 25.07.2012
comment
Почему бы тогда не переопределить setinslot?   -  person Jean-Michel Garcia    schedule 25.07.2012
comment
Я не знаю, как я могу это сделать. У меня есть LoginPresenter, который расширяет Presenter ‹›. Здесь я могу переопределить setInSlot (слот объекта, PresenterWidget ‹?› Content), но этот метод никогда не вызывается. То же самое с LoginView, которое расширяется от ViewImpl. Здесь я могу переопределить setInSlot (слот объекта, содержимое виджета), но этот также никогда не вызывается.   -  person Rasmus Nielsen    schedule 25.07.2012
comment
... или вы имели в виду клонирование src GWTP и переопределение setInSlot там? (потому что теперь я пытаюсь переопределить этот конкретный метод в моем собственном коде, который использует исходный gwtp src)   -  person Rasmus Nielsen    schedule 25.07.2012
comment
toolongdidntread.com/gwt/using-nested-presenters-with-gwtp или stackoverflow.com/questions/7578123/nested-presenters-with -gwtp может быть, эти ссылки могут помочь вам   -  person Jean-Michel Garcia    schedule 25.07.2012
comment
Рад, что ты нашел решение. В качестве дополнительного примечания ваше решение должно быть опубликовано как ответ (а не путем редактирования исходного вопроса).   -  person Jean-Michel Garcia    schedule 31.07.2012
comment
Пожалуйста, опубликуйте свое РЕШЕНИЕ в качестве ответа, чтобы другие тоже могли извлечь выгоду :)   -  person Adel Boutros    schedule 31.07.2012


Ответы (1)


Думаю, я дошел до сути своей проблемы.

Я прочитал эту проблему http://code.google.com/p/gwt-platform/issues/detail?id=127

В одном из постов показано, как создать собственный RootPresenter. RootPresenter также содержит RootView, в котором размещен вышеупомянутый метод setInSlot, и, написав настраиваемое представление, можно переопределить этот метод и убедиться, что draw() вызывается в макетах SmartGWT, а не добавляется в RootPanel.get().add(...);

Мой имп выглядит так:

public class CustomRootPresenter extends RootPresenter
{
    public static final class CustomRootView extends RootView
    {
        @Override
        public void setInSlot(Object slot, Widget content)
        {
            if (content instanceof Layout)
            {
                // clear
                RootLayoutPanel.get().clear();
                RootPanel.get().clear();

                Layout layout = (Layout) content;
                layout.draw();
            }
            else
            {
                super.setInSlot(slot, content);
            }
        }
    }

    @Inject
    public CustomRootPresenter(EventBus eventBus, CustomRootView myRootView)
    {
        super(eventBus, myRootView);
    }
}

Не забудьте вставить настраиваемый корневой презентатор в свой модуль GIN:

// don't use install, when using custom RootPresenter
// install(new DefaultModule(ClientPlaceManager.class));

bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
bind(TokenFormatter.class).to(ParameterTokenFormatter.class).in(Singleton.class);
bind(CustomRootPresenter.class).asEagerSingleton();
bind(PlaceManager.class).to(ClientPlaceManager.class).in(Singleton.class);
bind(GoogleAnalytics.class).to(GoogleAnalyticsImpl.class).in(Singleton.class);

Это определенно решило мою проблему с добавлением виджетов GWT в макеты SmartGWT.

Спасибо Жан-Мишелю Гарсиа за то, что подтолкнул меня в правильном направлении! :)

person Rasmus Nielsen    schedule 13.08.2012