我无法理解GWT中Has****Handlers
接口的含义。如果类实现HasClickHandlers
(addClickHandler
)和ClickHandler
(onClick
)接口,会有什么不同。
谢谢
答案 0 :(得分:7)
HasClickHandlers
- 可以点击的内容,例如一个按钮
ClickHandler
- 点击处理的一些代码
HasClickHandlers
对象是一个小部件,就像一个按钮,可以在用户点击它时作出反应。但是按钮本身并不知道当用户点击它时会发生什么。开发人员可以创建一个ClickHandler
对象,这是一些代码,用于实现用户单击该按钮时应该发生的事情。可以给一个按钮ClickHandler
以响应用户的点击,即按钮可以拥有/保持点击处理程序 - HasClickHandlers
。
有人可能会问为什么GWT说应用程序应该定义具有方法签名的视图接口,如:
HasClickHandlers getSaveButton();
而不是简单
Button getSaveButton();
谷歌主张将观点与主持人脱钩。演示者通常非常关心按钮的所有功能 - 它通常只关心按钮是否可以使用点击处理程序并使用它。像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方法对click事件起作用,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();
}
}
}
...
答案 1 :(得分:2)
HasClickHandlers用于生成点击事件的对象。 ClickHandler用于处理事件的对象。
例如,Button会生成一个click事件。如果要处理单击事件,可以创建一个包含执行此操作的代码的ClickHandler。您使用Button对象注册此ClickHandler,以便在发生单击时,Button知道要告诉它的人。 HasClickHandlers接口由Button(通过FocusWidget父类)实现,它只是注册ClickHandlers的接口。该接口简单地标准化了ClickHandlers的注册。