Groovy Bean 风格的事件处理

除了属性之外,JavaBean 也能作为事件源供给事件监听器,一个事件监听器是一个有一个回调方法用来通知这个监听器的对象,一个事件对象用来作为参数传递给回调方法。

JDK 有不同类型的事件监听器,一个简单在按钮上的事件监听器是 Action Listeneer,这 有一个方法 actionPerformed(ActionEvent )在按钮点击的时候被调用,更复杂的例子是 Vetoab leCh angeListener,它允许在它的方法 vetoab leChange(PropertyChangeEvent)中抛出
一个 PropertyVetoException 来回滚改变的 bean 属性,别的用法是多方面的,在这里不可能提供一个完整的列表。

Groovy 通过一种简单但是强大的方式来支持事件监听器,假设你需要创建一个 Sw ing Jbutton,按钮的标签为“Push me!”,当按钮被点击的时候将标签的内容打印在控制台,一 个 Java 的实现时使用匿名内部类:[code]// Java

final JButton button = new JButton(“Push me!”);

button.addActionListener(new IActionListener(){

public void actionPerformed(ActionEvent event){ System.out.println(button.getText());
}

});
[/code]开发人员需要知道各自注册的监听器和事件类型(或者接口)及回调方法。

一个 groovy 开发人员仅仅附上一个闭包给按钮,就像它是按钮的一个属性,属性名称为相应的回调方法名称:[code]button = new JButton(‘Push me!’)

button.actionPerformed = { event →

println button.text

}
[/code]event 参数被增加时为了知道如何在需要的时候获取它,在这个例子中,它已经被忽略,因为在闭包中没有使用它。

注意:groovy 使用 bean 内省机制来决定是否属性赋值引用为 bean 支持的监听器的回调 方法,如果是这样,在通知的时候调用闭包,一个 ClosureListener 被透明的增加。一个 Closu reListener 是要求的接口的代理实现。

事件处理是 JavaBean 标准构想,不管怎样,在做任何事件处理之前你不需要在 Bean 中以某种方式声明你的对象。相反的:一旦你的对象支持这种事件处理风格,它就是一个 Bean。

尽管 groovy 增加了能将闭包作为监听器注册的能力,java 风格的 bean 事件处理完整的保留,这意味着你仍然可以使用 jav a 方法来获取所有注册的事件监听器,增加更多的监听器,或者在不需要的时候移除监听器。