JAVA图形界面(GUI)之事件处理机制

简介:

之前几篇博客中,我们编写了一些示例,但是这些示例并不能与读者进行交互,读者之所以对图形界面感兴趣,就是因为图形界面与读者交互能力强。但是单纯的界面是没有使用价值的,要是图形界面能与读者交流,那么必须了解java的事件处理机制。
首先组件要先注册事件处理器,当读者单击组件、移动鼠标或者敲击键盘都会产生事件(Event)。一旦有事件产生,应用程序做出对该事件的响应,这些组件就是事件源(Event Source)。接受、解析和处理事件,实现和读者交互的方法称之为事件处理器(Event Handler)。他们之间的工作关系如图:

Created with Raphaël 2.1.0外部作用事件源已注册事件处理器

事件源可以产生多种不同类型的事件,可以注册多种不同类型的事件监听器。当组件上发生某种事件,生成相应的事件对象,该对象中封装了有关该事件的各种信息。该对象被传递到相应的注册的事件处理器,这时事件的处理方法才执行。

事件监听器

事件监听器是类库中的一组接口,每种事件类都有一个负责监听这种事件对象的接口。接口中定义了处理该事件的抽象方法。
接口只是一个抽象定义,要想使用必须实现它。所以每次对事件进行处理是调用对应接口的实现类中的方法。当事件源产生事件并生成事件对象,该对象被送到事件处理器中,处理器调用接口实现类对象中的相应方法来处理该事件。
要想启动相应的事件监听器必须在程序中注册它。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * 事件监听器示例
 * 
 * @author jianggujin
 *
 */
public class EventDemo extends JFrame
{
   public EventDemo()
   {
      super("EventDemo");
      JButton btn1 = new JButton("按钮1");
      // 注册监听器
      btn1.addActionListener(new ButtonClick());
      add(btn1);
      setSize(300, 300);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setVisible(true);
   }

   public static void main(String[] args)
   {
      new EventDemo();
   }
}

/**
 * 实现动作监听器
 * 
 * @author jianggujin
 *
 */
class ButtonClick implements ActionListener
{

   @Override
   public void actionPerformed(ActionEvent e)
   {
      // 获得事件源
      Object obj = e.getSource();
      // 判断是否为按钮
      if (obj instanceof JButton)
      {
         JButton srcBtn = (JButton) obj;
         System.out.println("您单击了按钮:" + srcBtn.getText());
      }
      else
      {
         System.out.println("未知事件源");
      }
   }
}

当单击按钮时,将生成事件对象,对象中包含了事件源(按钮)的信息传送到已注册的事件监听器,监听器调用相应方法并将该对象传入。

事件的种类

JAVA处理事件响应的类和监听接口大多位于AWT包中。在java.swing.event包中有专门用于Swing组件的事件类和监听接口。
AWT事件类继承自AWTEvent,他们的超类是EventObject。在AWT事件中,事件分为低级事件和语义事件。语义事件是对某些低级事件的一种抽象概括,是单个或多个低级事件的某些特例的集合。
常用低级事件有:

事件 说明
KeyEvent 按键按下和释放产生该事件
MouseEvent 鼠标按下、释放、拖动、移动产生该事件
FocusEvent 组件失去焦点产生该事件
WindowEvent 窗口发生变化产生该事件

常用语义事件有:

事件 说明
ActionEvent 当单击按钮、选中菜单或在文本框中回车等产生该事件
ItemEvent 选中多选框、选中按钮或者单击列表产生该事件

常用事件和事件监听器如下:

事件类型 对应的监听器 监听器接口中的抽象方法
Action ActionListener actionPerformed(ActionEvent e)
Mouse MouseListener mouseClicked(MouseEvent e)、mouseEntered(MouseEvent e)、mouseExited(MouseEvent e)、mousePressed(MouseEvent e)、mouseReleased(MouseEvent e)
MouseMotion MouseMotionListener mouseDragged(MouseEvent e)、mouseMoved(MouseEvent e)
Item ItemListener itemStateChanged(ItemEvent e)
Key KeyListener keyPressed(KeyEvent e)、keyReleased(KeyEvent e)、keyTyped(KeyEvent e)
Focus FocusListener focusGained(FocusEvent e)、focusLost(FocusEvent e)
Window WindowListener windowActivated(WindowEvent e)、windowClosed(WindowEvent e)、windowClosing(WindowEvent e)、windowDeactivated(WindowEvent e)、windowDeiconified(WindowEvent e)、windowIconified(WindowEvent e)、windowOpened(WindowEvent e)
Component ComponentListener componentHidden(ComponentEvent e)、componentMoved(ComponentEvent e)、componentResized(ComponentEvent e)、componentShown(ComponentEvent e)
Text TextListener textValueChanged(TextEvent e)

事件适配器

事件适配器其实就是一个接口的实现类,实际上适配器类只是将监听接口方法中的方法全部实现成空方法。这样在定义事件监听器时就可以继承该实现类,并重写所需要的方法,不必实现覆盖所有方法了。常用的事件适配器类有如下击中

适配器 说明
MouseAdapter 鼠标事件适配器
WindowAdapter 窗口事件适配器
KeyAdapter 键盘事件适配器
FocusAdapter 焦点适配器
MouseMotionAdapter 鼠标移动事件适配器
ComponentAdapter 组件源适配器
ContainerAdapter 容器源事件适配器
目录
相关文章
|
2月前
|
人工智能 前端开发 安全
Java开发不可不知的秘密:类加载器实现机制
类加载器是Java中负责动态加载类到JVM的组件,理解其工作原理对开发复杂应用至关重要。本文详解类加载过程、双亲委派模型及常见类加载器,并介绍自定义类加载器的实现与应用场景。
185 4
|
4月前
|
人工智能 JavaScript Java
Java反射机制及原理
本文介绍了Java反射机制的基本概念、使用方法及其原理。反射在实际项目中比代理更常用,掌握它可以提升编程能力并理解框架设计原理。文章详细讲解了获取Class对象的四种方式:对象.getClass()、类.class、Class.forName()和类加载器.loadClass(),并分析了Class.forName()与ClassLoader的区别。此外,还探讨了通过Class对象进行实例化、获取方法和字段等操作的具体实现。最后从JVM类加载机制角度解析了Class对象的本质及其与类和实例的关系,帮助读者深入理解Java反射的工作原理。
101 0
|
4月前
|
人工智能 Java 关系型数据库
Java——SPI机制详解
SPI(Service Provider Interface)是JDK内置的服务提供发现机制,主要用于框架扩展和组件替换。通过在`META-INF/services/`目录下定义接口实现类文件,Java程序可利用`ServiceLoader`动态加载服务实现。SPI核心思想是解耦,允许不同厂商为同一接口提供多种实现,如`java.sql.Driver`的MySQL与PostgreSQL实现。然而,SPI存在缺陷:需遍历所有实现并实例化,可能造成资源浪费;获取实现类方式不够灵活;多线程使用时存在安全问题。尽管如此,SPI仍是Java生态系统中实现插件化和模块化设计的重要工具。
155 0
|
4月前
|
设计模式 人工智能 安全
AQS:Java 中悲观锁的底层实现机制
AQS(AbstractQueuedSynchronizer)是Java并发包中实现同步组件的基础工具,支持锁(如ReentrantLock、ReadWriteLock)和线程同步工具类(如CountDownLatch、Semaphore)等。Doug Lea设计AQS旨在抽象基础同步操作,简化同步组件构建。 使用AQS需实现`tryAcquire(int arg)`和`tryRelease(int arg)`方法以获取和释放资源,共享模式还需实现`tryAcquireShared(int arg)`和`tryReleaseShared(int arg)`。
234 32
AQS:Java 中悲观锁的底层实现机制
|
4月前
|
Java 区块链 网络架构
酷阿鲸森林农场:Java 区块链系统中的 P2P 区块同步与节点自动加入机制
本文介绍了基于 Java 的去中心化区块链电商系统设计与实现,重点探讨了 P2P 网络在酷阿鲸森林农场项目中的应用。通过节点自动发现、区块广播同步及链校验功能,系统实现了无需中心服务器的点对点网络架构。文章详细解析了核心代码逻辑,包括 P2P 服务端监听、客户端广播新区块及节点列表自动获取等环节,并提出了消息签名验证、WebSocket 替代 Socket 等优化方向。该系统不仅适用于农业电商,还可扩展至教育、物流等领域,构建可信数据链条。
|
5月前
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
130 3
|
5月前
|
JavaScript 前端开发 Java
【Java进阶】详解JavaScript事件
总的来说,JavaScript事件是JavaScript交互设计的核心,理解和掌握JavaScript事件对于编写高效、响应式的网页应用至关重要。
96 15
|
5月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
457 1
|
存储 Java 容器
Java中GUI的继承体系图
  组件:组件就是对象。   容器组件:是可以存储基本组件和容器组件的组件。   基本组件:是可以使用的组件,但必须依赖容器组件。   注意:     由于Component、Container、Window类的方法太多太多了,     所以我们学习Frame、Dialog、FileDialog类。
1189 0
|
9天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案