将事件添加到组件

在 Java™ 可视编辑器的“设计”视图或 Java bean 视图中,可将事件添加到组件。
关于此任务
要将事件添加到组件:
  1. 右键单击 Java bean 视图或“设计”视图中的组件。
  2. 从弹出菜单,单击事件 弹出菜单将显示组件的首选事件。请执行以下某个步骤:
    • 单击组件的某个首选事件。此事件将添加到组件中。例如,对于 JFrame,首选事件是 windowClosed 和 windowOpened。
    • 单击添加事件以打开“添加事件”窗口。
  3. 如果打开了“添加事件”窗口,将显示可供选择的已分类事件列表。选择要添加的事件,然后单击完成
    • “添加事件”对话框显示树中组件的所有可用事件。该树将事件侦听器显示为第一级别的条目,在每个侦听器条目下是事件可以进行的可能回调。
      “添加事件”对话框
    • 您可以使用该对话框来指定是要创建侦听器还是使用现有侦听器。当对话框打开时,它会分析现有侦听器,如果找到了它认为可以复用的侦听器,那么它会使用其他图标来标记该侦听器。对于扩展适配器类的现有侦听器,将使用 事件显示类 图标,否则将使用 事件显示。在侦听器自身内,使用绿色箭头 绿色箭头 显示现有事件,而使用未完成箭头 未完成事件 显示可用事件
    • 您可以指定是要使用现有的侦听器还是创建新的侦听器。如果要创建新的侦听器,那么可以选择是需要它扩展适配器类还是实现侦听器接口。如果某个选项不适用,那么将禁用相应的单选按钮。例如,如果不存在现有侦听器,或虽然选择了现有侦听器但所选事件已在使用,那么将禁用使用现有侦听器。如果没有适配器类可用于新侦听器,那么将禁用扩展:ADAPTER_CLASS_NAME 单选按钮。
    • 如果在“添加事件”对话框中选择 propertyChange,那么您还会有用于添加回调的其他选项。可以创建新的侦听器并使用方法 addPropertyChange(PropertyChangeListener listener) 将其添加到 Java bean。如果出现这种情况,那么侦听器的通用回调方法 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{} 块)。


结果

添加事件时,如果存在可以使用的现有侦听器,那么会向其添加回调方法。否则,将创建新侦听器。对于要使用的现有侦听器,它必须是 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,那么它特定于某个特殊属性,因此无法复用于其他属性。在此情况下,将禁用所有的“事件”级联菜单子代。


反馈