【发布时间】:2011-01-17 21:14:48
【问题描述】:
我无法理解 GWT 中 Has****Handlers 接口的含义。如果一个类实现HasClickHandlers (addClickHandler) 和ClickHandler (onClick) 接口会有什么区别。
谢谢
【问题讨论】:
我无法理解 GWT 中 Has****Handlers 接口的含义。如果一个类实现HasClickHandlers (addClickHandler) 和ClickHandler (onClick) 接口会有什么区别。
谢谢
【问题讨论】:
HasClickHandlers - 可以点击的东西,例如一个按钮
ClickHandler - 一些点击处理的代码
HasClickHandlers 对象是一个小部件,就像一个按钮,可以在用户点击它时做出反应。但是一个按钮本身并不知道当用户点击它时会发生什么。开发人员可以制作一个ClickHandler 对象,这是一些实现用户单击该按钮时应该发生的事情的代码。可以为按钮指定 ClickHandler 以响应用户的点击,即按钮可以拥有/保持点击处理程序 - HasClickHandlers。
有人可能会问,为什么 GWT 说应用程序应该定义带有方法签名的视图接口,例如:
HasClickHandlers getSaveButton();
而不是简单
Button getSaveButton();
Google 提倡将视图与演示者分离。演示者通常很少关心按钮的所有功能——它通常只关心按钮是可以接受点击处理程序并使用它的东西。像HasClickHandler 这样的接口只有很少的方法并且很容易模拟。然而,使用真正的按钮有时需要初始化整个 UI 框架的一部分或部分并实例化先决条件上下文类,以便创建一个用于测试的按钮。
通过让接口返回HasClickHandler 而不是Button,演示者的单元测试代码可以通过简单地模拟HasClickHandler 之类的接口来完全脱离UI 框架的复杂性。这意味着更简单的测试脚手架和非常快速的单元测试(因为您没有初始化/与 UI 框架交互的开销)。
http://googletesting.blogspot.com/2009/08/tott-testing-gwt-without-gwttest.html
编辑
OP 询问:
好的,例如如果 ABC 类实现 Hasclickhandlers 和 Clickhandler,然后实现 onClick 和 addClickHandler(返回 HandlerRegistration),这意味着 1)它将通过 onClick 方法作用于点击事件,并且 2)将让任何其他类知道(谁在实现 ClickHandler 和使用 ABC 类的 addClickHandler 来注册事件)点击刚刚发生?对吧?
像ABC 这样的类不会实现HasClickHandlers。只有像按钮这样的 GWT 小部件实现 HasClickHandlers。 Google 只是提供HasClickHandlers 接口作为声明对某些小部件(如按钮)的变量引用的替代方式。这些小部件将通知注册的ClickHandler 按钮单击。
您的类ABC 可能实现ClickHandler 或可能包含派生自ClickHandler 的内部(可能是匿名的)类。典型用法如下:
public class ABC {
...
getSaveButton().addClickHandler(
new ClickHandler() {
public void onClick(ClickEvent event) {
saveToDatabase();
}
}
}
...
【讨论】:
HasClickHandlers 用于生成点击事件的对象。 ClickHandler 用于处理事件的对象。
例如,一个按钮会产生一个点击事件。当您想要处理单击事件时,您需要创建一个包含执行此操作的代码的 ClickHandler。您将这个 ClickHandler 注册到 Button 对象,以便当点击发生时,Button 知道该告诉谁。 HasClickHandlers接口由Button实现(通过FocusWidget父类),就是注册ClickHandlers的接口。这个接口简单的标准化了ClickHandlers的注册。
【讨论】: