我是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询问。
感谢阅读
答案 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)
对于resizeTo(width, height)
电话,您必须通过询问周围的容器来确定宽度和高度,例如使用
container.getElement().getClientWidth()