当前位置: 首页 > 教程 > ATW >

AWT 事件处理

精华
小牛编辑
130浏览
2023-03-14

什么是事件

对象状态的变化称为事件,即事件描述源状态的变化。事件是作为用户与图形用户界面组件交互的结果而生成的。例如,单击按钮、移动鼠标​​、通过键盘输入字符、从列表中选择项目、滚动页面都是导致事件发生的活动。

事件的类型

事件大致可以分为两类:

  • 前台事件:那些需要用户直接交互的事件。它们是作为人与图形用户界面中的图形组件交互的结果而生成的。例如,单击按钮、移动鼠标​​、通过键盘输入字符、从列表中选择项目、滚动页面等。

  • 后台事件:那些需要最终用户交互的事件称为后台事件。操作系统中断、硬件或软件故障、计时器到期、操作完成是后台事件的示例。

什么是事件处理

事件处理是控制事件并决定事件发生时应该发生什么的机制。这种机制具有称为事件处理程序的代码,在事件发生时执行。Java 使用委托事件模型来处理事件。该模型定义了生成和处理事件的标准机制。让我们简单介绍一下这个模型。

委托事件模型具有以下主要参与者,即:

  • 事件源:源是发生事件的对象。Source 负责将发生的事件的信息提供给它的处理程序。Java 为源对象提供类。

  • 侦听器:也称为事件处理程序。侦听器负责生成对事件的响应。从java实现的角度来看,监听器也是一个对象。侦听器等待,直到它收到一个事件。接收到事件后,侦听器处理事件并返回。

这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。用户界面元素能够将事件的处理委托给单独的代码段。在这个模型中,监听器需要向源对象注册,这样监听器才能接收到事件通知。这是处理事件的有效方式,因为事件通知仅发送给想要接收它们的侦听器。

事件处理的步骤

  • 用户单击按钮并生成事件。

  • 相关事件类的对象被自动创建,事件源和事件的信息被填充到同一个对象中。

  • 事件对象被转发到注册监听器类的方法。

  • 该方法被执行并返回。

事件的回调方法

这些方法由 API 提供者提供,由应用程序程序员定义并由应用程序开发人员调用。这里的回调方法代表一个事件方法。为了响应一个事件,java jre 将触发回调方法。所有这些回调方法都在侦听器接口中提供。

如果一个组件想要一些监听器来监听它的事件,则事件源必须将自己注册到监听器。

事件处理的示例

package cn.xnip;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AwtControlDemo {

   private Frame mainFrame;
   private Label headerLabel;
   private Label statusLabel;
   private Panel controlPanel;

   public AwtControlDemo(){
      prepareGUI();
   }

   public static void main(String[] args){
      AwtControlDemo  awtControlDemo = new AwtControlDemo();
      awtControlDemo.showEventDemo();
   }

   private void prepareGUI(){
      mainFrame = new Frame("小牛知识库网:Java AWT Examples");
      mainFrame.setSize(400,400);
      mainFrame.setLayout(new GridLayout(3, 1));
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });    
      headerLabel = new Label();
      headerLabel.setAlignment(Label.CENTER);
      statusLabel = new Label();        
      statusLabel.setAlignment(Label.CENTER);
      statusLabel.setSize(350,100);

      controlPanel = new Panel();
      controlPanel.setLayout(new FlowLayout());

      mainFrame.add(headerLabel);
      mainFrame.add(controlPanel);
      mainFrame.add(statusLabel);
      mainFrame.setVisible(true);  
   }

   private void showEventDemo(){
      headerLabel.setText("Control in action: Button"); 

      Button okButton = new Button("OK");
      Button submitButton = new Button("Submit");
      Button cancelButton = new Button("Cancel");

      okButton.setActionCommand("OK");
      submitButton.setActionCommand("Submit");
      cancelButton.setActionCommand("Cancel");

      okButton.addActionListener(new ButtonClickListener()); 
      submitButton.addActionListener(new ButtonClickListener()); 
      cancelButton.addActionListener(new ButtonClickListener()); 

      controlPanel.add(okButton);
      controlPanel.add(submitButton);
      controlPanel.add(cancelButton);       

      mainFrame.setVisible(true);  
   }

   private class ButtonClickListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         String command = e.getActionCommand();  
         if( command.equals( "OK" ))  {
            statusLabel.setText("Ok Button clicked.");
         }
         else if( command.equals( "Submit" ) )  {
            statusLabel.setText("Submit Button clicked."); 
         }
         else  {
            statusLabel.setText("Cancel Button clicked.");
         }  	
      }		
   }
}

输出结果为: