0

我是 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 的方法显示,我有这个方法(实际上我有两个 ActivityMapper,两个方法如下面和两个容器,用于菜单和正文)

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 构建的视图......在每个视图中,我声明一个布局并像这样返回它

public Widget asWidget() {
  return my_layout_declared;
 } 

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

我已经更详细地说明了我的问题,以确保任何人都能理解。如果你的帖子可以帮助我,请问你 Chris Lercher。

感谢阅读

4

1 回答 1

0

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

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

但是,这样说是错误的

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

布局面板(自 2009 年 12 月 8 日发布的 GWT 2.0 以来的“新”面板)实际上可以(请参阅 ProvidesResize 和 RequiresResize 接口)。因此,如果您有这样一个面板作为您的 MVP 主体容器(并且如果它的父级也是 LayoutPanel 到顶部的 RootLayoutPanel),那么您也可以覆盖主体容器的onResize()方法,而不是监听 Window resize 事件。

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

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

  • 当您放入(新的)Smart GWT 布局时,例如,您可能会在 Place 更改时放入一个新布局。
  • 当窗口调整大小时,或者发生其他改变容器大小的事情时(或者,如果您使用的是布局面板,您可以使用它的 onResize())

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

container.getElement().getClientWidth()
于 2013-09-17T18:52:30.947 回答