GWT:AcceptsOneWidget vs Composite vs IsWidget

时间:2013-06-26 03:00:24

标签: java gwt mvp

GWT有很多类似名称(以及看似类似用途)的类型:

  • Widget
  • AcceptsOneWidget
  • Composite
  • IsWidget
  • SimplePanel

何时/何地适合使用这些?他们与RootPanel的关系是什么?

2 个答案:

答案 0 :(得分:11)

让我们首先从类中分离接口。

接口非常适合模拟(因此允许在不需要缓慢的GWTTestCase的情况下测试您的应用程序):

  • IsWidget:当你需要的只是一个小部件上的句柄时,不依赖于Widget类。这通常与MVP一起用作表示视图的方式。
  • AcceptsOneWidget:当您需要单个窗口小部件的占位符时(以IsWidget的形式)。这通常与“活动”一起使用,将视图IsWidget)插入到给定的广告位AcceptsOneWidget)。

您列出的类都扩展为Widget,因此它们依赖于JSNI并且(大多数情况下)需要在 GWT环境中运行(对于单元测试,这意味着{ {1}}):

  • GWTTestCase:所有小部件的基础。实现从Widget返回自己的IsWidget
  • asWidget():当您需要创建从其他窗口小部件构建的窗口小部件时隐藏其实现的基类。虽然您可以扩展现有小部件,但通常最好将其隐藏在Composite内,这样您只需公开您需要/想要公开的API。 Composite是关于“组合而不是继承”和封装。标准小部件中的合成示例包括Composite(由TabPanelTabBar构建),DeckPanel(由DateBoxTextBox构建一个DatePicker),PopupPanel包裹ValueListBoxListBox包裹ValuePicker。在许多情况下,假设小组接受CellList个孩子,您可以简单地实施IsWidget而不是IsWidget,但有时候 true {{1 }}。
  • Composite一个实现Widget的面板,在使用活动时可用作插槽(但您也可以轻松实现SimplePanel插入任何类型的面板)

话虽如此,Google最近开源GWT-Mockito将Mockito插入AcceptsOneWidget并使用 classloader magic 重写JSNI方法并删除AcceptsOneWidget修饰符您可以直接在测试中使用小部件,而无需GWT.create()或MVP。

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

答案 1 :(得分:4)

你们已经搞砸了。

小工具:它允许您与用户进行互动。 (例如Button

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

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

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

IsWidget :几乎所有已知小部件实现的界面。它提供对该小部件的访问。

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

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