Awt 简明教程

AWT Event Handling

What is an Event?

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

Types of Event

事件大致可以分为两类:

  1. Foreground Events - 那些需要用户直接交互的事件。它们是由人员与图形用户界面中的图形组件交互产生的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项、滚动页面等。

  2. Background Events - 需要用户交互的那些事件被称为后台事件。操作系统中断、硬件或软件故障、计时器过期、操作完成是后台事件的示例。

What is Event Handling?

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

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

  1. Source - 源是一个发生事件的对象。源负责将发生事件的信息提供给它的处理程序。Java 为我们提供源对象的类。

  2. Listener - 它也称为事件处理程序。侦听器负责生成对事件的响应。从 Java 实现的角度来看,侦听器也是一个对象。侦听器一直等到收到事件。一旦收到事件,侦听器会处理事件,然后返回。

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

Steps involved in event handling

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

  2. 现在,相关事件类的对象会自动创建,有关源和事件的信息将填充在同一对象中。

  3. 事件对象将转发到已注册的侦听器类的​​方法。

  4. 该方法现在开始执行并返回。

Points to remember about listener

  1. 为了设计侦听器类,我们必须开发一些侦听器接口。这些监听器接口预测侦听器类必须实现的一些公共抽象回调方法。

  2. 如果您没有实现任何预定义的接口,那么您的类将无法充当源对象的侦听器类。

Callback Methods

这些是由 API 提供者提供的,由应用程序程序员定义并由应用程序开发人员调用的方法。在此,回调方法表示事件方法。为了响应事件,Java JRE 将触发回调方法。所有此类回调方法都在侦听器接口中提供。

如果组件希望某个侦听器侦听其事件,则该源必须将自身注册到侦听器。

Event Handling Example

使用你选择的任意编辑器在给定的 D:/ > AWT > com > tutorialspoint > gui > 中创建以下 Java 程序

package com.tutorialspoint.gui;

import java.awt.*;
import java.awt.event.*;

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.");
         }
      }
   }
}

使用命令提示符编译该程序。转到 *D:/ > AWT * 并键入以下命令。

D:\AWT>javac com\tutorialspoint\gui\AwtControlDemo.java

如果没有错误,则表示编译成功。使用以下命令运行该程序。

D:\AWT>java com.tutorialspoint.gui.AwtControlDemo

验证以下输出

awt button