我正在使用GWT 2.4,SmartGWT 3.0,GWTP 0.7。
我主要尝试将SmartGWT小部件用于我的布局,但我正在尝试将SmartTWT小部件中的GWT小部件(可以是从MapWidget到ChartWidget的任何内容,从HighCharts或GWT标签)添加到选项卡中。然后我得到以下异常:
Caused by: java.lang.AssertionError: A widget that has an existing parent widget may not be added to the detach list
这仅在开发模式下发生。在生产中,断言已经关闭,我的小部件确实出现了,但它使得无法在开发模式下进行调试。据我所知,这是因为我正在混合使用SmartGWT和GWT小部件。
在GWTP之前,我能够完成这项工作,因为要显示我的UI,我会在我的根布局上调用draw()
,这是一个VLayout。现在我正在使用GWTP,当我触发RevealRootContentEvent
时它会显示我的布局,它会通过调用RootPanel.get().add(...)
添加布局,我认为这就是为什么我有现在这些问题。我的所有布局仍然在SmartGWT中。
是否有人遇到过相同的问题(在相同的设置中)以及如何处理?
答案 0 :(得分:3)
所以我认为我已经解决了问题的根源。
我读过这个问题 http://code.google.com/p/gwt-platform/issues/detail?id=127
在其中一篇文章中,展示了如何创建自定义RootPresenter。 RootPresenter还包含一个RootView,其中放置了前面提到的setInSlot
方法,通过编写自定义视图,可以覆盖该方法,并确保在SmartGWT布局上调用draw()
,而不是而不是添加到RootPanel.get().add(...);
我的impl看起来像这样:
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布局的问题。
感谢Jean-Michel Garcia推动我朝着正确的方向前进! :)