可以在“设计”视图或 Java Bean 视图中对组件添加事件。
使用双自变量方法添加的侦听器是特定于特殊属性的,所以,它不能被重用于另一个属性。使用单自变量方法添加的侦听器带有一个 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{} 块)。
添加事件时,如果可以使用现有侦听器,则向其添加回调方法。否则,将创建新侦听器。对于要使用的现有侦听器,它必须是实现侦听器接口的 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 是特定于特殊属性的,因此不能被重用于另一个属性。在这种情况下,将会禁用所有“事件”级联菜单子代。