Swing 简明教程

SWING - Event Handling

在本章中,你将了解事件、其类型,以及如何处理事件。本文末尾提供了示例,以帮助你更好地理解。

What is an Event?

对象的上述状态变化称为 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

Step 1 −用户单击按钮,生成事件。

Step 2 −自动创建有关事件类的对象,并将有关源和事件的信息填充到同一对象中。

Step 3 −事件对象转到已注册侦听器类的,方法。

Step 4 −该方法得到执行并返回。

Points to Remember About the Listener

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

  2. 如果您没有实现任何预定义的接口,那么您的类不能作为源对象的侦听器类。

Callback Methods

这些方法由 API 供应商提供并且由应用程序程序员定义,由应用程序开发人员调用。此处,回调方法表示事件方法。响应事件,java jre 将激发回调方法。所有此类回调方法都包含在侦听器接口中。

如果某个组件希望有侦听器来侦听其事件,则源必须向侦听器注册自身。

Event Handling Example

使用您选择的任意编辑器,使用以下命令创建 Java 程序,例如 D:/ > SWING > com > tutorialspoint > gui >

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 button