事件处理(Event Handling)
在本章中,您将了解事件及其类型,并了解如何处理事件。 为了更好地理解,本章末尾提供了示例。
什么是事件? (What is an Event?)
对象状态的更改称为Event ,即事件描述源的状态更改。 由于用户与图形用户界面组件的交互而生成事件。 例如,单击按钮,移动鼠标,通过键盘输入字符,从列表中选择项目以及滚动页面是导致事件发生的活动。
事件类型
这些活动大致可分为两类 -
Foreground Events - 这些事件需要用户的直接交互。 它们是作为人与图形用户界面中的图形组件交互的结果而生成的。 例如,单击按钮,移动鼠标,通过键盘输入字符,从列表中选择项目,滚动页面等。
Background Events - 这些事件需要最终用户的交互。 操作系统中断,硬件或软件故障,计时器到期和操作完成是后台事件的一些示例。
什么是事件处理?
事件处理是控制事件并决定事件发生时应该发生什么的机制。 此机制具有一个代码,称为事件处理程序,在事件发生时执行。
Java使用委派事件模型来处理事件。 此模型定义了生成和处理事件的标准机制。
授权事件模型具有以下主要参与者。
Source - 源是事件发生的对象。 Source负责向其处理程序提供已发生事件的信息。 Java为我们提供了源对象的类。
Listener - 它也称为事件处理程序。 监听器负责生成对事件的响应。 从Java实现的角度来看,侦听器也是一个对象。 听众等待直到收到事件。 收到事件后,侦听器处理事件然后返回。
这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。 用户界面元素能够将事件的处理委托给单独的代码。
在此模型中,需要向源对象注册侦听器,以便侦听器可以接收事件通知。 这是处理事件的有效方式,因为事件通知仅发送给想要接收它们的侦听器。
涉及事件处理的步骤
Step 1 - 用户单击按钮并生成事件。
Step 2 - 自动创建相关事件类的对象,并在同一对象中填充有关源和事件的信息。
Step 3 - 将事件对象转发到已注册的侦听器类的方法。
Step 4 - 该方法被执行并返回。
关于监听器的要点
为了设计一个监听器类,您必须开发一些监听器接口。 这些Listener接口预测了一些公共抽象回调方法,这些方法必须由监听器类实现。
如果未实现任何预定义接口,则您的类不能充当源对象的侦听器类。
回调方法
这些是API提供程序提供的方法,由应用程序程序员定义并由应用程序开发人员调用。 这里的回调方法代表一个事件方法。 在响应事件时,java jre将触发回调方法。 所有这些回调方法都在监听器接口中提供。
如果组件想要某个侦听器监听其事件,则源必须将自己注册到侦听器。
事件处理示例
使用您选择的任何编辑器创建以下Java程序,例如D:/ 》 SWING 》 com 》 xnip 》 gui 》
SwingControlDemo.java
package cn.xnip.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\xnip\gui\SwingControlDemo.java
如果没有错误发生,则表示编译成功。 使用以下命令运行该程序。
D:\AWT>java cn.xnip.gui.SwingControlDemo
验证以下输出。