对组件添加事件

可以在“设计”视图或 Java Bean 视图中对组件添加事件。

要对组件添加事件:
  1. 在 Java Bean 视图或“设计”视图中右键单击该组件。
  2. 从弹出菜单中,单击事件弹出菜单显示了该组件的首选事件。执行下列其中一个步骤:
    • 单击该组件的其中一个首选事件。该事件将被添加到该组件。例如,对于 JFrame,首选事件是 windowClosed 和 windowOpened。
    • 单击添加事件以打开“添加事件”窗口。
  3. 如果已打开“添加事件”窗口,则将显示已分类的事件列表以供您选择。选择要添加的事件并单击完成
    • “添加事件”对话框以树的形式显示组件的所有可用事件。该树将事件侦听器作为第一层条目显示,并在每个侦听器条目下面显示该事件可以引发的可能回调。
      添加事件对话框
    • 可以使用该对话框来指定是要创建新侦听器还是要使用现有的侦听器。当该对话框打开时,它会分析现有侦听器,如果它找到它认为可以重用的侦听器,它就用另一个图标来标记该侦听器:如果现有侦听器继承适配器类,则显示 事件存在类,否则显示 事件存在。在侦听器自身中,现有事件用绿色箭头 绿色箭头 显示,可用事件用不完整的箭头 非事件 显示。
    • 您可以指定是要使用现有侦听器还是要创建新侦听器。当创建新侦听器时,可以选择是要让它继承适配器类还是仅仅实现侦听器接口。如果某个选项不适用,则单选按钮处于禁用状态。例如,如果没有现有侦听器,或者已选择某个现有侦听器,但所选事件已经被使用,则使用现有侦听器处于禁用状态。如果没有可用的适配器类可供新侦听器使用,则继承:ADAPTER_CLASS_NAME 单选按钮处于禁用状态。
    • 如果在“添加事件”对话框中选择 propertyChange,则还有一些用于添加回调的选项。可以创建一个可使用方法 addPropertyChange(PropertyChangeListener listener) 添加至 JavaBean 的新侦听器。如果创建这种侦听器,则将该侦听器的通用回调方法 propertyChange(PropertyChangeEvent event) 用于所有属性事件。对于某些 JavaBeans(例如,Swing 组件),提供了一个双自变量方法 addPropertyChange(String propertyName, PropertyChangeListener listener),缺省情况下,该方法被选择用于新侦听器。

      添加事件对话框

      使用双自变量方法添加的侦听器是特定于特殊属性的,所以,它不能被重用于另一个属性。使用单自变量方法添加的侦听器带有一个 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 是特定于特殊属性的,因此不能被重用于另一个属性。在这种情况下,将会禁用所有“事件”级联菜单子代。

上级主题:使用 Visual Editor 来处理事件

相关概念
Java Bean 视图

相关任务
从组件中删除事件
查看组件的事件
查看事件的源代码

(C) Copyright IBM Corporation 1999, 2004. All Rights Reserved.