SWING - 事件处理

在本章中,您将了解事件及其类型,并学习如何处理事件。 本章末尾提供了示例以便更好地理解。


什么是事件?

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


事件类型

事件大致可以分为两类 −

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

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


什么是事件处理?

事件处理是控制事件并决定事件发生时应该发生什么的机制。 该机制具有称为事件处理程序的代码,当事件发生时执行该代码。

Java 使用委托事件模型来处理事件。 该模型定义了生成和处理事件的标准机制。

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

  • Source − 源是发生事件的对象。 Source 负责向其处理程序提供已发生事件的信息。 Java 为我们提供了源对象的类。

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

这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。 用户界面元素能够将事件的处理委托给单独的一段代码。

在这个模型中,监听器需要注册到源对象中,这样监听器才能接收到事件通知。 这是处理事件的一种有效方式,因为事件通知仅发送给那些想要接收它们的侦听器。


事件处理涉及的步骤

步骤 1 − 用户点击按钮,就会产生事件。

步骤 2 − 相关事件类的对象是自动创建的,并且有关源和事件的信息会填充在同一对象中。

步骤 3 − 事件对象被转发给注册的监听类的方法。

步骤 4 − 该方法被执行并返回。


关于监听器要记住的要点

  • 为了设计一个监听器类,你必须开发一些监听器接口。 这些监听器接口预测了一些公共抽象回调方法,这些方法必须由监听器类实现。

  • 如果您没有实现任何预定义的接口,那么您的类就不能充当源对象的侦听器类。


回调方法

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

如果一个组件想要某个侦听器来侦听它的事件,那么源必须将自己注册到侦听器。


事件处理示例

D:/ > SWING > com > tutorialspoint > gui > 中使用您选择的任何编辑器创建以下 Java 程序

SwingControlDemo.java

package com.tutorialspoint.gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingControlDemo {
   private JFrame mainFrame;
   private JLabel headerLabel;
   private JLabel statusLabel;
   private JPanel controlPanel;

   public SwingControlDemo(){
      prepareGUI();
   }
   public static void main(String[] args){
      SwingControlDemo swingControlDemo = new SwingControlDemo();  
      swingControlDemo.showEventDemo();       
   }
   private void prepareGUI(){
      mainFrame = new JFrame("Java SWING Examples");
      mainFrame.setSize(400,400);
      mainFrame.setLayout(new GridLayout(3, 1));

      headerLabel = new JLabel("",JLabel.CENTER );
      statusLabel = new JLabel("",JLabel.CENTER);        
      statusLabel.setSize(350,100);
      
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });    
      controlPanel = new JPanel();
      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"); 

      JButton okButton = new JButton("OK");
      JButton submitButton = new JButton("Submit");
      JButton cancelButton = new JButton("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:/ > SWING 并输入以下命令。

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

如果没有出现错误,则说明编译成功。 使用以下命令运行程序。

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

验证以下输出。

SWING 事件处理