Java GWT:AcceptsOneWidget vs Composite vs IsWidget

Java GWT:AcceptsOneWidget vs Composite vs IsWidget,java,gwt,mvp,Java,Gwt,Mvp,GWT有许多类似的命名(并且似乎目的相似)类型: Widget AcceptsOneWidget Composite IsWidget SimplePanel 何时/何地使用这些工具?它们与根面板的关系是什么?你把一切都搞混了 小部件:它允许您与用户交互。(例如) 面板:这些小部件可以包含其他面板/小部件。可以称为小部件的容器 接受widget:由只接受一个小部件的面板实现。(例如) Composite:一种小部件,可以包装另一个小部件,隐藏包装的小部件的方法。组合对于从单个面板中包含的多个

GWT有许多类似的命名(并且似乎目的相似)类型:

  • Widget
  • AcceptsOneWidget
  • Composite
  • IsWidget
  • SimplePanel

何时/何地使用这些工具?它们与
根面板的关系是什么?

你把一切都搞混了

小部件:它允许您与用户交互。(例如)

面板:这些小部件可以包含其他面板/小部件。可以称为小部件的容器

接受widget:由只接受一个小部件的面板实现。(例如)

Composite:一种小部件,可以包装另一个小部件,隐藏包装的小部件的方法。组合对于从单个面板中包含的多个其他小部件的集合中创建单个小部件非常有用

IsWidget:几乎所有已知widget都实现的接口。它提供对该小部件的访问

SimplePanel:只包含一个小部件的面板


RootPanel:是添加所有其他面板的基础面板。

让我们首先将接口与类分开

界面非常适合模拟(因此可以在不需要缓慢的
GWTTestCase
的情况下测试应用程序):

  • IsWidget
    :当您只需要一个widget上的句柄,而不依赖于
    widget
    类时。这通常与MVP一起使用,作为表示视图的一种方式
  • AcceptsOneWidget
    :当您需要单个小部件的占位符时(以
    IsWidget
    的形式)。这通常与活动一起使用,用于将视图(
    IsWidget
    )插入给定的插槽(
    AcceptsOneWidget
您列出的类都扩展了
Widget
,因此它们依赖于JSNI,并且(大多数情况下)需要在GWT环境中运行(对于单元测试,这意味着
GWTTestCase
):

  • 小部件
    :所有小部件的基础。实现从
    asWidget()返回自身的
    IsWidget
  • Composite
    :当您需要创建从其他小部件构建的小部件,同时隐藏其实现时,它是一个基类。虽然可以扩展现有的小部件,但通常最好将其隐藏在
    组合中
    ,以便只公开需要/想要公开的API<代码>复合
是关于“组合而非继承”和封装的。标准小部件中的组合示例包括
TabPanel
(从
TabBar
DeckPanel
构建)、
DateBox
(从
popupanel
中的
TextBox
DatePicker
构建),包装
列表框的
值列表框
或包装
单元格列表的
值选择器
。在许多情况下,如果面板接受
IsWidget
子项,您可以简单地实现
IsWidget
而不是扩展
Composite
,但有时有一个真正的
小部件是有用的
  • SimplePanel
    实现
    AcceptsOneWidget
    的面板,在使用活动时用作插槽(但您也可以轻松实现
    AcceptsOneWidget
    插入任何类型的面板)
  • 话虽如此,谷歌最近公开了将Mockito插入
    GWT.create()
    的源代码,并使用classloader magic重写JSNI方法并删除
    final
    修饰符,这样您就可以在测试中直接使用小部件,而无需
    gwtsetcase
    或MVP

    所以,总而言之,这取决于您如何处理代码,如何构建应用程序。如果您使用MVP,请坚持在演示者中使用仅依赖于接口的(
    IsWidget
    AcceptsOneWidget
    ),以便您可以轻松地在测试中模拟视图。
    否则,或者如果您想要一个视图为UiBinder模板的“简化MVP”,请在测试中尝试GWT Mockito并直接使用小部件。
    当然,您可以在同一个应用程序中混合使用这两种方法。在任何情况下,都可以将您自己的小部件构建为
    Widget
    s,用于底层(很少需要),而
    Composite
    s或
    IsWidget
    s,用于其他所有内容,而不是扩展现有的小部件。

    谢谢@Kaushik(+1)-下面几个问题:(1)面板和复合组件似乎都是1+小部件的容器:那么何时使用它们中的每一个合适呢?和(2)是否需要向根面板添加1+面板才能在浏览器中显示UI?再次感谢!1) 复合材料不是容器而是包装物。基本上,您可以使用它们来创建自定义小部件。面板用于添加小部件。2) 您可以向根面板添加1个或多个面板,但我建议您使用Flow panel(相当于HTML Div)或VerticalPanel(相当于HTML表)作为容器,并将该容器添加到根面板。