可以在 Visual Editor for Java 的“设计”视图或 Java Bean 视图中对组件添加事件。
添加事件时,如果可以使用现有侦听器,则向其添加回调方法。否则,将创建新侦听器。对于要使用的现有侦听器来说,它必须是实现侦听器接口的 JavaBean 上的匿名内部类。它的回调方法的方法主体必须是空的,或者扩展适配器类并且没有用于正在添加的事件回调的现有方法。对于属性来说,如果通过单参数方法 addPropertyChange(PropertyChangeListener listener) 将现有的 PropertyChangeListener 添加至 JavaBean,则将重用这个现有的 PropertyChangeListener。如果它尚未包含代码,则将添加处理属性。
如果不存在可向其添加回调方法的现有候选侦听器,则将创建新侦听器。这将是一个匿名内部类,并且,如果已经为事件定义了适配器类,则侦听器将扩展这个适配器类。否则,它将实现侦听器接口。在添加事件后,将创建带有 //TODO 注释的存根方法。存根方法是事件发生时将要执行的源代码的指示符,您应该将此方法更改为执行所需的行为。//TODO 注释显示在“任务”窗口中,并且标记了不完整的方法。因此,您可以在稍后找到它们,并且一旦编写了回调逻辑就可以除去 //TODO 注释。
在上一个示例中,windowOpened 方法已经存在。如果这是扩展适配器的侦听器,则由于它还没有 windowClosed 方法,所以将重用这一个侦听器。将添加方法 windowClosed(WindowEvent e),添加的方法存根和 //TODO 注释如下所示:
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent e) {
System.out.println("windowClosed()"); // TODO Auto-generated stub windowClosed()
}
public void windowOpened(java.awt.event.WindowEvent e) {
callExistingWindowOpenedLogic();
}
});
在专家方式下,仍然可以按上述方法将事件添加至 JavaBean,但是也可以将它们添加至 Java Bean 树中的侦听器。“事件”菜单显示了侦听器上的所有事件回调方法,任何已被使用的方法将处于禁用状态。
对于 PropertyChangeListener 来说,弹出菜单显示了 JavaBean 上的所有绑定属性。如果任何绑定属性已被 PropertyChangeListener 使用,则它们将处于禁用状态。
使用单参数方法添加的侦听器具有 if 语句,该语句在处理每个属性回调的逻辑之前检查属性的名称,如以下代码所示:
javaBean.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent e) {
if ((e.getPropertyName().equals("font"))) {
System.out.println("propertyChange(font)");
}
}
});
这将允许使用单参数方法添加的 PropertyChangeListener 被用于多个属性(通过使用多个 if{} 块),并且当添加第二个及后续属性回调时,将会添加新的 if{} 块。
如果是使用双参数方法 addPropertyChangeListener(String propertyName, PropertyChangeListener listener) 将 propertyChangeListener 添加至 JavaBean 的,则 propertyChangeListener 是特定于特殊属性的,因此不能被重用于另一个属性。在这种情况下,将会禁用所有“事件”级联菜单子代。