添加事件时,如果存在可以使用的现有侦听器,那么会向其添加回调方法。否则,将创建新侦听器。对于要使用的现有侦听器,它必须是 Java bean 上实现侦听器接口的匿名内部类。 该类必须具有用于回调方法的空方法主体,或必须扩展适配器类。且没有用于添加的事件回调的现有方法。对于属性,如果使用单参数方法 addPropertyChange(PropertyChangeListener listener) 将现有 PropertyChangeListener 添加到 Java bean,那么将复用 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();
}
});
在专家方式中,事件仍可按照先前所示那样添加到 Java bean,但是它们也可以添加到 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,那么它特定于某个特殊属性,因此无法复用于其他属性。在此情况下,将禁用所有的“事件”级联菜单子代。