0

私はGWT2.4、SmartGWT 3.0、GWTP0.7を使用しています。

私は主にSmartGWTウィジェットをレイアウトに使用しようとしていますが、GWTウィジェット(MapWidgetからHighChartsのChartWidgetまたはGWTラベルまで)をSmartGWTタブセットのタブに追加しようとしています。次に、次の例外が発生します。

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

これは、開発モードでのみ発生します。本番環境では、アサーションがオフになっていて、ウィジェットは表示されますが、Devモードでデバッグできなくなります。私が理解しているように、それは私がSmartGWTウィジェットとGWTウィジェットを混合しているためです。

GWTPの前は、UIを表示するためにdraw()、VLayoutであるルートレイアウトを呼び出すため、これを機能させることができました。GWTPを使用しているので、を起動するとレイアウトが表示され、RevealRootContentEventを呼び出すことでレイアウトが追加されますRootPanel.get().add(...)。これが、これらの問題が発生している理由だと思います。私のレイアウトはすべてSmartGWTのままです。

誰かが(同じセットアップで)同じ問題を経験しましたか?これはどのように処理できますか?

4

1 に答える 1

3

だから私は自分の問題の根底に到達したと思います。

この問題を読みました http://code.google.com/p/gwt-platform/issues/detail?id=127

投稿の1つでは、カスタムRootPresenterを作成する方法が示されています。setInSlotRootPresenterには、前述のメソッドが配置されるRootViewも含まれています。カスタムビューを作成することで、そのメソッドをオーバーライドし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);

SmartGWTレイアウトにGWTウィジェットを追加する際の私の問題は間違いなく解決しました。

私を正しい方向に押してくれたJean-MichelGarciaに感謝します!:)

于 2012-08-13T06:50:14.907 に答える