GWT有很多类似名称(以及看似类似用途)的类型:
Widget
AcceptsOneWidget
Composite
IsWidget
SimplePanel
何时/何地适合使用这些?他们与RootPanel
的关系是什么?
答案 0 :(得分:11)
让我们首先从类中分离接口。
接口非常适合模拟(因此允许在不需要缓慢的GWTTestCase
的情况下测试您的应用程序):
IsWidget
:当你需要的只是一个小部件上的句柄时,不依赖于Widget
类。这通常与MVP一起用作表示视图的方式。AcceptsOneWidget
:当您需要单个窗口小部件的占位符时(以IsWidget
的形式)。这通常与“活动”一起使用,将视图(IsWidget
)插入到给定的广告位(AcceptsOneWidget
)。您列出的类都扩展为Widget
,因此它们依赖于JSNI并且(大多数情况下)需要在 GWT环境中运行(对于单元测试,这意味着{ {1}}):
GWTTestCase
:所有小部件的基础。实现从Widget
返回自己的IsWidget
。asWidget()
:当您需要创建从其他窗口小部件构建的窗口小部件时隐藏其实现的基类。虽然您可以扩展现有小部件,但通常最好将其隐藏在Composite
内,这样您只需公开您需要/想要公开的API。 Composite
是关于“组合而不是继承”和封装。标准小部件中的合成示例包括Composite
(由TabPanel
和TabBar
构建),DeckPanel
(由DateBox
和TextBox
构建一个DatePicker
),PopupPanel
包裹ValueListBox
或ListBox
包裹ValuePicker
。在许多情况下,假设小组接受CellList
个孩子,您可以简单地实施IsWidget
而不是IsWidget
,但有时候 true {{1 }}。Composite
一个实现Widget
的面板,在使用活动时可用作插槽(但您也可以轻松实现SimplePanel
插入任何类型的面板)话虽如此,Google最近开源GWT-Mockito将Mockito插入AcceptsOneWidget
并使用 classloader magic 重写JSNI方法并删除AcceptsOneWidget
修饰符您可以直接在测试中使用小部件,而无需GWT.create()
或MVP。
所以,总而言之,这取决于您如何处理代码,以及如何构建应用程序。如果您使用MVP,请仅依靠演示者中的接口(final
,GWTTestCase
),以便在测试中轻松模拟您的视图。
否则,或者如果您想要一个视图是UiBinder模板的“简化MVP”,请尝试GWT-Mockito进行测试并直接使用小部件。
当然,您可以在同一个应用程序中混合使用这两种方法。在任何情况下,为低级别事物(很少需要)构建自己的小部件IsWidget
,为其他所有内容构建AcceptsOneWidget
或Widget
s,而不是扩展现有小部件。
答案 1 :(得分:4)
你们已经搞砸了。
小工具:它允许您与用户进行互动。 (例如Button)
面板:这些小部件可以包含其他面板/小部件。可以称为小部件的容器。
AcceptsOneWidget :由只接受一个小部件的面板实现。 (例如SimplePanel)
复合:一种可以包装另一个小部件的小部件,隐藏包装小部件的方法。该复合对于从单个面板中包含的多个其他窗口小部件的聚合中创建单个窗口小部件非常有用。
IsWidget :几乎所有已知小部件实现的界面。它提供对该小部件的访问。
SimplePanel :仅包含一个小部件的面板。
RootPanel :是添加了所有其他面板的基本面板。