视图大小与GWT MVP和SmartGWT中的layoutPanel容器不匹配

时间:2013-09-17 11:57:48

标签: gwt mvp smartgwt

我是GWT的新手,并且在视图实现方面存在问题......我使用MVP和SmartGWT。我将通过定义我如何解决我的MVP以及它的奇怪之处来揭露这一点。

在我的onModule中,我定义了使用UIbinder构建的类。我已经声明了一个LayoutPanel,并在类的构造函数中将它设置为这样。

layoutPanel = binder.createAndBindUi(this);

我在这个课程中有容器:

public void setBodyLayout() {
panel.setWidgetLeftWidth(menuPanel, xx, PCT, xxx, PCT);
panel.setWidgetRightWidth(bodyPanel, xx, PCT, xx, PCT);
}

menuPanel和bodyPanel都是在上面的类中声明的simplePanel(UIfield与UIbinder一起使用)。在LayoutPanel中有。对于我的ActivityMapper的方法显示我已经有了这个方法(实际上我有两个ActivityMappers,下面两个方法和两个容器,用于菜单和正文)

public AcceptsOneWidget getBodyContainer() {
return new AcceptsOneWidget() {
  @Override
  public void setWidget(IsWidget w) {
    Widget widget = Widget.asWidgetOrNull(w);
    bodyPanel.setWidget(widget);
  }
};}

在我的onModule中返回,我声明我的ActivityMapper就像这样

BodyActivityMapper bodyContainerActivityMapper = new BodyActivityMapper(clientFactory);
ActivityManager bodyContainerActivityManager = new ActivityManager(bodyContainerActivityMapper, eventBus);
bodyContainerActivityManager.setDisplay(my_class_described_above.getBodyContainer());

使用MenuActivityMapper完成了同样的工作......

最后

RootLayoutPanel.get().add(my_class_described_above.getLayoutPanel());

当getLayoutPanel()返回我在上面声明的类中声明的layoutPanel时。

因此,每个区域都有自己的ActivityMapper.ActivityMapper,菜单只有一个活动,“ActivityMapperBody”有菜单触发的多个活动。

容器的实用程序是为了解决我的布局以进行不同的“动作”。我用它定义了区域,以便接收以活动开始的视图。

但是这个配置只适用于使用UIbinder构建的视图...在每个视图中,我声明一个Layout并像这样返回

public Widget asWidget() {
  return my_layout_declared;
 } 

当我返回布局时,没有任何作用。我真的不明白为什么,我认为smartgwt更糟糕。所有我想要的只是检索我的布局并将其放入我的容器中...使用smartgwt可以节省大量时间......

我更详细地解决了我的问题,以确保有人理解。如果您的帖子可以帮助我,请向Chris Lercher询问。

感谢阅读

1 个答案:

答案 0 :(得分:0)

Smart GWT FAQ提到了一个解决方案:

  

如果您绝对必须在GWT容器中放置Smart GWT接口,并且您希望它   填充容器,最好的方法是监听窗口级别的resize事件并运行   您自己的布局计算最终会在最顶层的Smart GWT上调用resizeTo()   窗口小部件。

然而,说

是错误的
  

... GWT容器[不]在调整大小时触发事件

Layout panels(自2009年12月8日发布的GWT 2.0以来的“新”面板)实际上做了(参见ProvideResize和RequiresResize接口)。因此,如果你有一个这样的面板作为你的MVP体容器(如果它的父节点也是LayoutPanels直到顶级RootLayoutPanel),那么你也可以覆盖正文容器的onResize()方法,而不是监听Window resize事件。

那你怎么解决你的具体问题呢?

您需要在最顶层的Smart GWT布局上调用resizeTo(width, height)

  • 当您输入(新)智能GWT布局时,例如也许你在Place改变的时候换上一个新的。
  • 当窗口调整大小时,或者当其他事情发生时,会改变容器的大小(或者,如果您使用的是布局面板,则可以使用其onResize())

对于resizeTo(width, height)电话,您必须通过询问周围的容器来确定宽度和高度,例如使用

container.getElement().getClientWidth()