云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 事件与常用组件介绍

事件与常用组件介绍

  • 62 次阅读
  • 3 次下载
  • 2025/5/30 18:14:57

事件驱动程序设计

图形用户界面是静态的,它应该能够响应用户的操作。比如,当用户在GUI上输入一个字符或点击鼠标,都会发生事件,程序根据事件类型作出反应就是事件处理。

1.1 事件处理模型与事件类

在Java 1.1版之前事件处理采用事件传递模型,这种方法有一定的缺点,因此从Java 1.1版开始,Java的事件处理采用了新的事件处理模型,我们称为事件代理模型(event delegation model)。尽管在Java 2中仍然支持两种模型,但推荐使用新的事件模型。

所谓事件代理模型就是将事件的处理从事件源对象代理给一个或多个称为事件监听器(listener)的对象,事件由事件监听器处理。事件代理模型把事件的处理委托给外部实体进行处理,实现了事件源和监听器分离的机制。

事件代理模型涉及到三种对象:事件源、事件和事件监听器。

① 事件源(event source):产生事件的对象,一般来说可以是组件,如按钮、对话框等。当这些对象的状态改变时,就会产生事件。事件源可以是可视化组件,也可以是计时器等不可视的对象。

② 事件(event):描述事件源状态改变的对象。如按钮被点击,就会产生ActionEvent动作事件。

③ 事件监听器(listener):接收事件并对其进行处理的对象。事件监听器对象必须是实现了相应接口的类的对象。

Java的事件处理模型如图1所示。首先在事件源上注册事件监听器,当用户行为触发一个事件时,运行时系统寻找事件监听器对象来处理事件。

用户 行为 生成一 个事件 事件对象 通知 监听器 监听器对象 事件处理程序 事件源 注册一个监听器对象 图 1 Swing事件处理模型

为了实现事件处理,Java定义了大量的事件类,这些类封装了事件对象。Swing组件可产生多种事件,如点击按钮、选择菜单项会产生动作事件(ActionEvent),关闭窗口会产生窗口事件(WindowEvent)等。

所有事件类的根类是java.util.EventObject类,该类的定义为: package java.util;

public class EventObject implements java.io.Serializable { protected transient Object source; public EventObject(Object source) {

if (source == null)

throw new IllegalArgumentException(\ this.source = source; }

public Object getSource() { return source; }

294

第12章 事件处理与常用组件

public String toString() {

return getClass().getName() + \ } }

其中,getSource()方法是最重要的方法,它返回触发事件的事件源对象,注意它的返回类型是Object。

java.awt.AWTEvent是EventObject类的子类,同时又是所有组件AWT事件类的根类,该类中定义了public int getID()方法,它返回事件的类型。

AWTEvent类的常用的子类是在java.awt.event包中定义的,其中常用的AWT事件类如图2所示:

EventObject ActionEvent AdjustmentEvent AWTEvent ComponentEvent ItemEvent TextEvent ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent MouseEvent KeyEvent 图 2常用的AWT事件类及层次关系

不同的组件可以产生不同的事件,下表列出了在哪些组件上可以产生哪些事件。

表1 常用事件及产生事件的组件

事件类型 ActionEvent AdjustmentEvent ComponentEvent Container FocusEvent ItemEvent KeyEvent MouseEvent TextEvent WindowEvent 事件名称 动作事件 调整事件 组件事件 容器事件 焦点事件 选项事件 键盘事件 鼠标事件 文本事件 窗口事件 产生事件的组件 JButton,JTextField, JMenuItem,JList JScrollBar JComponent类及其子类 JContainer类及其子类 同ComponentEvent JCheckbox, JCheckboxMenuItem, JComboBox, JList 同ComponentEvent 同ComponentEvent JTextField, JtextArea JFrame, JWindow, JDialog 每种事件类除了继承超类中定义的方法外,自己也定义了许多事件处理的常量和方法。例如,在MouseEvent类中定义了getX()、getY()方法用来返回鼠标事件的坐标位置,在KeyEvent类中定义了getKeyChar()方法用来返回发生键盘事件的字符。 1.2 事件监听器接口

事件的处理必须由实现了相应的事件监听器接口的类对象处理。Java为每类事件定义了相应的接口。事件类和接口都是在java.awt.event包中定义的。表2列出了常用的事件监听器接口、接口中定义的方法以及所处理的事件。

表2 事件监听器接口、方法及处理的事件

监听器接口 ActionListener ItemListener 接口中的方法 actionPerformed(ActionEvent e) itemStateChanged(ItemEvent e) 所处理的事件 ActionEvent ItemEvent

第12章 事件处理与常用组件

295

MouseListener mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) MouseEvent MouseMotionListener KeyListener mouseMoved(MouseEvent e) mouseDragged(MouseEvent e) keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) MouseEvent KeyEvent FocusListener AdjustmentListener CompomentListener focusGained(FocusEvent e) focusLost(FocusEvent e) AdjustmentValueChanged (AdjustmentEvent e) componentMoved(ComponentEvent e) componentHiden(ComponentEvent e) componentResized(ComponentEvent e) componentShown(ComponentEvent e) FocusEvent AdjustmentEvent ComponentEvent WindowListener windowOpened(WindowEvent e) windowClosing(WindowEvent e) windowClosed(WindowEvent e) windowActivated(WindowEvent e) windowDeactivated(WindowEvent e) windowIconified(WindowEvent e) windowDeiconified(WindowEvent e) WindowEvent ContainerListener TextListener componentAdded(ContainerEvent e) componentRemoved(ContainerEvent e) textValueChanged(TextEvent e) ContainerEvent TextEvent 大多数监听器接口与事件类有一定的对应关系,如对于ActionEvent事件,接口为ActionListener,对于WindowEvent事件,对应的接口为WindowListener。这里有一个例外,即MouseEvent对应两个接口MouseListener和MouseMotionListener。接口中定义了一个或多个方法,这些方法都是抽象方法,必须由实现接口的类实现,Java程序就是通过这些方法实现对事件的处理的。 1.3 事件处理的基本步骤

下面以一个例子说明使用事件代理模型处理事件的主要步骤。 假设要编写一个界面如图3所示应用程序,该程序需要完成的功能是:当用户点击“OK”按钮时,在文本框中显示“You clicked button OK”,当点击“Cancel”按钮时,在文本框中显示“You clicked button Cancel”。

图3 简单的事件处理程序

296

第12章 事件处理与常用组件

完成该事件处理的一般步骤为:

① 确定事件源和要处理的事件的类型

确定事件源就是确定要处理哪些组件的事件,这里事件源就是两个按钮,假设引用名分别为btn1和btn2。接下来确定处理什么事件,这里要处理的事件就是点击按钮事件,即ActionEvent事件。

② 实现相应的监听器接口并创建监听器对象

这里就需要实现ActionListener接口。实现监听器接口可有多种方法,可以用内部类或匿名内部类实现,也可以在定义的类中用implements实现,还可以单独定义类实现,这里推荐使用内部类。另外,一个类可以实现一个接口,也可以实现多个接口。对于有多个方法的接口,系统还定义了事件适配器类,所以可以通过继承事件适配器类实现。注意实现监听器接口必须实现接口中定义的所有方法。实现接口中定义的方法就是编写事件处理的代码。

③ 为组件注册监听器

每种组件都定义了可以触发的事件类型,使用相应的方法为组件注册监听器。如果程序运行过程中,对某事件不需处理,也可以不注册监听器,甚至注册了监听器也可以注销。注册和注销监听器的一般方法如下:

public void addXXXListener(XXXListener l) //注册监听器 public void removeXXXListener(XXXlistener l) //注销监听器

如为按钮注册动作事件,需使用按钮的addActionListener(ActionListener l)方法。如为btn1按钮注册监听器使用的代码为:

btn1.addActionListener(al); // al为监听器对象

只有为组件注册了监听器后,在程序运行时,当发生该事件时才能由监听器对象处理,否则即使发生了相应的事件,事件也不会对处理。

一个事件源可能发生多种事件,因此可以由多个事件监听器处理;反过来一个监听器对象也可以处理多个事件源的同一类型的事件,如上述程序两个按钮我们可以用一个监听器对象处理。

下面对上述问题使用不同方法实现监听器接口:

1. 通过内部类实现监听器接口

程序 EventDemo.java import java.awt.*;

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

public class EventDemo extends JFrame{ JTextField tf ; JButton btn1,btn2; public EventDemo(){ super(\ tf = new JTextField(20); btn1 = new JButton(\ btn2 = new JButton(\ Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(tf); cp.add(btn1);

cp.add(btn2);

AL listener = new AL(); //创建一个监听器对象

btn1.addActionListener(listener); //为按钮注册监听器 btn2.addActionListener(listener);

搜索更多关于: 事件与常用组件介绍 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

事件驱动程序设计 图形用户界面是静态的,它应该能够响应用户的操作。比如,当用户在GUI上输入一个字符或点击鼠标,都会发生事件,程序根据事件类型作出反应就是事件处理。 1.1 事件处理模型与事件类 在Java 1.1版之前事件处理采用事件传递模型,这种方法有一定的缺点,因此从Java 1.1版开始,Java的事件处理采用了新的事件处理模型,我们称为事件代理模型(event delegation model)。尽管在Java 2中仍然支持两种模型,但推荐使用新的事件模型。 所谓事件代理模型就是将事件的处理从事件源对象代理给一个或多个称为事件监听器(listener)的对象,事件由事件监听器处理。事件代理模型把事件的处理委托给外部实体进行处理,实现了事件源和监听器分离的机制。 事件代理模

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com