Java图形用户界面设计AWT事件处理

AWT事件处理

  • 前言
  • 一、GUI事件处理机制
    • 定义
    • 使用步骤
    • Swing事件处理机制与AWT的区别
  • 二、GUI中常见事件和事件监听器
    • 事件
      • 低级事件
      • 高级事件
    • 事件监听器
    • AWT事件类的继承关系
  • 三、事件适配器
  • 三、示例
    • 代码示例
      • 示例一
      • 示例二
    • 示例三


前言

推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。
https://www.captainbed.cn/f1

AWT事件处理涉及Java AWT(抽象窗口工具包)中定义的事件及其处理机制。它允许开发者为图形用户界面组件(如按钮、文本框等)定义事件响应行为,如点击、键盘输入等。通过注册事件监听器并编写事件处理逻辑,AWT能够响应用户与界面元素的交互,实现动态和交互式的应用体验。

前面的文章介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面还不能响应用户的任何操作。比如单击前面所有窗口右上角的“X”按钮,但窗口依然不会关闭。因为在 AWT 编程中 ,所有用户的操作,都必须都需要经过一套事件处理机制来完成,而 Frame 和组件本身并没有事件处理能力 。


一、GUI事件处理机制

定义

当在某个组件上发生某些操作的时候,会自动的触发一段代码的执行。

在GUI事件处理机制中涉及到4个重要的概念需要理解:

事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮、窗口等;
事件(Event):在事件源上发生的操作可以叫做事件,GUI会把事件都封装到一个Event对象中,如果需要知道该事件的详细信息,就可以通过Event对象来获取。
事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理。

注册监听:把某个事件监听器(A)通过某个事件(B)绑定到某个事件源( C )上,当在事件源C上发生了事件B之后,那么事件监听器A的代码就会自动执行。

在这里插入图片描述

使用步骤

  1. 创建事件源组件对象;

  2. 自定义类,实现XxxListener接口,重写方法;

  3. 创建事件监听器对象(自定义类对象)

  4. 调用事件源组件对象的addXxxListener方法完成注册监听

Swing事件处理机制与AWT的区别

Swing 的事件处理机制与 AWT 保持一致,甚至很多事件的处理仍然使用的是java.awt.event包中的类和接口。为了扩展事件处理能力,在javax.swing.event包中新增了一些新的事件类及其监听器接口。

二、GUI中常见事件和事件监听器

事件监听器必须实现事件监听器接口, AWT 提供了大量的事件监听器接口用于实现不同类型的事件监听器,用于监听不同类型的事件 。 AWT 中提供了丰富的事件类,用于封装不同组件上所发生的特定操作, AWT 的事件类都是 AWTEvent 类的子类 , AWTEvent是 EventObject 的子类。

事件

AWT把事件分为了两大类:
在这里插入图片描述

低级事件

这类事件是基于某个特定动作的事件。比如进入、点击、拖放等动作的鼠标事件,再比如得到焦点和失去焦点等焦点事件。

事件触发时机
ComponentEvent组件事件 , 当 组件尺寸发生变化、位置发生移动、显示/隐藏状态发生改变时触发该事件。
ContainerEvent容器事件 , 当容器里发生添加组件、删除组件时触发该事件 。
WindowEvent窗口事件, 当窗 口状态发生改变 ( 如打开、关闭、最大化、最 小化)时触发该事件 。
FocusEvent焦点事件 , 当组件得到焦点或失去焦点 时触发该事件 。
KeyEvent键盘事件 , 当按键被按下、松开、单击时触发该事件。
MouseEvent鼠标事件,当进行单击、按下、松开、移动鼠标等动作 时触发该事件。
PaintEvent组件绘制事件 , 该事件是一个特殊的事件类型 , 当 GUI 组件调 用 update/paint 方法 来呈现自身时触发该事件,该事件并非专用于事件处理模型 。

高级事件

这类事件并不会基于某个特定动作,而是根据功能含义定义的事件。

事件触发时机
ActionEvent动作事件 ,当按钮、菜单项被单击,在 TextField 中按 Enter 键时触发
AjustmentEvent调节事件,在滑动条上移动滑块以调节数值时触发该事件。
ltemEvent选项事件,当用户选中某项, 或取消选中某项时触发该事件 。
TextEvent文本事件, 当文本框、文本域里的文本发生改变时触发该事件。

事件监听器

在这里插入图片描述

不同的事件需要使用不同的监听器监听,不同的监听器需要实现不同的监听器接口, 当指定事件发生后 , 事件监听器就会调用所包含的事件处理器(实例方法)来处理事件 。

事件类别描述信息监听器接口名
ActionEvent激活组件ActionListener
ItemEvent选择了某些项目ItemListener
MouseEvent鼠标移动MouseMotionListener
MouseEvent鼠标点击等MouseListener
KeyEvent键盘输入KeyListener
FocusEvent组件收到或失去焦点FocusListener
AdjustmentEvent移动了滚动条等组件AdjustmentListener
ComponentEvent对象移动缩放显示隐藏等ComponentListener
WindowEvent窗口收到窗口级事件WindowListener
ContainerEvent容器中增加删除了组件ContainerListener
TextEvent文本字段或文本区发生改变TextListener

AWT事件类的继承关系

在这里插入图片描述

三、事件适配器

事件适配器(Adapter),本质上是一种特殊的类。它是一个或者多个事件监听器接口的实现类,为接口中的每个抽象方法进行了空实现,即在方法体经中没有任何语句。

当某个事件监听器接口中的抽象方法多于一个时,可能只对其中部分抽象方法的实现有需求。但是按照Java 语法规则,非抽象的事件监听器类必须实现接口中的全部方法;不但加大了编程工作量做无用功,而且增加程序的复杂度,降低程序的清晰度。为了解决此类问题,Java 中采用了事件适配器。很容易理解,Java 没有必要为每个事件监听器配备对应的事件适配器,只有抽象方法的数目超过一个的事件监听器才为之提供。

WindowListener、 KeyListener, MouseListener 和 MouseMotionListener 都有一个以上的抽象方法,因此在 java.awt.event 包中提供了相应的事件适配器 WindowAdapter、KeyAdapter、MouseAdapter、MouseMotionAdapter。

由于 Java 提供了事件适配器,事件监听器类可以通过继承事件适配器,按照需要来重写特定的事件处理方法,为编程带来了便利。但是,由于Java的类采用单一继承机制,当事件监听器类已经存在父类,或者需要实现多个事件监听器接口时,就不能再继承事件适配器。

三、示例

代码示例

示例一

完成下图效果,点击确定按钮,在单行文本域内显示 hello world:
在这里插入图片描述

public class EventDemo1 {Frame  frame = new Frame("这里测试事件处理");//事件源Button button = new Button("确定");TextField tf = new TextField(30);public void init(){//注册监听button.addActionListener(new MyActionListener());//添加组件到frame中frame.add(tf);frame.add(button,BorderLayout.SOUTH);//设置frame最佳大小并可见frame.pack();frame.setVisible(true);}//自定义事件监听器类private  class MyActionListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("用户点击了确定按钮");tf.setText("hello world");}}public static void main(String[] args) {new EventDemo1().init();}
}
  • 通过ContainerListener监听Frame容器添加组件;

  • 通过TextListener监听TextFiled内容变化;

  • 通过ItemListener监听Choice条目选中状态变化;

示例二

在这里插入图片描述

import java.awt.*;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;public class ListenerDemo1 {public static void main(String[] args) {Frame frame = new Frame("这里测试监听器");//创建一个单行文本域TextField tf = new TextField(30);//给文本域添加TextListener,监听内容的变化tf.addTextListener(new TextListener() {@Overridepublic void textValueChanged(TextEvent e) {System.out.println("当前内容:"+tf.getText());;}});//给frame注册ContainerListener监听器,监听容器中组件的添加frame.addContainerListener(new ContainerAdapter() {@Overridepublic void componentAdded(ContainerEvent e) {Component child = e.getChild();System.out.println("容器中添加了新组件:"+child);}});//添加tf到frameframe.add(tf);//设置frame最佳大小并可见frame.pack();frame.setVisible(true);}
}

示例三

给Frame设置WindowListner,监听用户点击 X 的动作,如果用户点击X,则关闭当前窗口

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class ListenerDemo2 {public static void main(String[] args) {Frame frame = new Frame("这里测试WindowListener");frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});frame.setBounds(200,200,500,300);frame.setVisible(true);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Thread

目录 Thread API 主要接口说明 测试代码编写 代码分析 hi3861使用的实时系统主要是基于Huawei LiteOS-M,这是华为针对物联网领域推出的轻量级物联网操作系统内核。LiteOS-M是Huawei LiteOS的一个分支,专为IoT领域构建,主要面向没有MMU&am…

sqlmap使用以及GUI安装

下载 GUI版地址: GitHub - honmashironeko/sqlmap-gui: 基于官版本 SQLMAP 进行人工汉化,并提供GUI界面及多个自动化脚本 GUI使用 可以点击.bat启动 如果点击.bat启动不了就在这里打开cmd,输入对应的.bat来启动 linux安装 地址:sqlmap: automatic SQL injection…

c++中串口的安全封装使用

固定缓冲区大小:在这种情况下,你将缓冲区大小固定为4096字节。如果你的数据量可能超过这个限制,可能需要反复调用读取操作以确保读取完整的数据。 局部变量初始化:在C中,局部变量如果不是内置类型(如int、…

Java基础——String类详解,实用解释

String类(不是基本数据类型) - String的不可变性 在 Java 8 中&#xff0c; String 内部使用 char 数组存储数据。并且被声明为 final &#xff0c;因此它不可被继承。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence…

记忆化搜索——AcWing 901. 滑雪

记忆化搜索 定义 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来&#xff0c;在后续遇到相同情况时直接返回存储的结果&#xff0c;避免重复计算。 运用情况 当问题可以用递归方式求解&#xff0c;但存在大量重复计算时。一些复杂的组…

python从入门到精通3:变量

在Python编程中&#xff0c;变量是一个非常重要的概念。它们用于存储数据&#xff0c;并在程序执行过程中进行数据的读取、修改和传递。理解变量的概念、命名规则、数据类型以及作用域&#xff0c;对于编写高效、健壮的Python代码至关重要。下面&#xff0c;我们将对Python变量…

收藏||电商数据采集流程||电商数据采集API接口

商务数据分析的流程 第一步&#xff1a;明确分析目的。首先要明确分析目的&#xff0c;并把分析目的分解成若干个不同的分析要点&#xff0c;然后梳理分析思路&#xff0c;最后搭建分析框架。 第二步&#xff1a;数据采集。主流电商API接口数据采集&#xff0c;一般可以通过数…

集装箱超重问题怎么解决一文读懂‼️

超重处理与限重政策详解 在国际海运过程中&#xff0c;集装箱超重会面临不同的处理方式和限制政策。以下是详细解析&#xff1a; 一、超重处理 船公司超重处理&#xff1a; 补交超重费&#xff1a;与船公司协商&#xff0c;补交超重费即可正常运输。 港区超重处理&#xff1a;…

顶顶通呼叫中心中间件-私有化asrproxy安装指南

一、安装asrproxy 上传asrproxy安装包到服务器目录&#xff1a;/root 上传完成之后依次执行下面的命令即可依次执行以下命令 cd ~mkdir -p /ddt/asrproxyunzip asrproxy_*.zip -d /ddt/asrproxycd /ddt/asrproxychmod x installlib.sh./installlib.shchmod x asrproxychmod x…

浪潮(Inspur)服务器硬件监控指标解读

随着企业业务的快速发展&#xff0c;服务器的稳定运行成为保障业务连续性的关键。浪潮&#xff08;Inspur&#xff09;服务器以其卓越的性能和稳定性&#xff0c;在数据中心中扮演着重要角色。 为了确保服务器的稳定运行&#xff0c;监控易作为一款专业的IT基础设施监控软件&am…

工控巨头去年业绩飙升10%,今年250亿出售子业务给美国黑石集团,意欲何为?...

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 在工业自动化领域&#xff0c;艾默生一直以其卓越的技术和强…

互联网摸鱼日报(2024-06-21)

互联网摸鱼日报(2024-06-21) 36氪新闻 「宁王们」出海&#xff0c;钉钉造船 时机已经成熟&#xff0c;“电竞入奥”这次似乎真的要成了 快充与电池容量齐飞&#xff0c;手机体验才能更加均衡 上万块买片叶子&#xff0c;热带植物成为新式潮玩 让哈弗H6破防的价格战&#x…

C++ - 介绍enum的使用

在 C 中&#xff0c;枚举关键字用于定义枚举&#xff0c;枚举是一种用户定义的数据类型&#xff0c;由一组命名的积分常量组成。枚举可以用有意义的名称来表示相关常量的集合&#xff0c;从而提高代码的可读性和可维护性。 In C, the enum keyword is used to define an enumer…

CubeFS - 新一代云原生存储系统

CubeFS 是一种新一代云原生存储系统,支持 S3、HDFS 和 POSIX 等访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性。 官方文档 CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面…

驱动芯片退饱和保护(DESAT)

短路测试和双脉冲测试。 功率模块的短路承受能力的评估分为短路时间评估和短路能量评估两大类。短路时间由短路检测时间与短路关断时间共同构成 短路检测需要兼顾时效性与抗扰性能&#xff0c;要求系统能够及时响应&#xff0c;避免功率模块损坏。同时能够屏蔽开关过程的干扰…

车辆轨迹预测系列 (一):轨迹预测方法综述解析

文章目录 车辆轨迹预测系列 (一)&#xff1a;轨迹预测方法综述解析1、Contextual FactorsPhysics-related factors (物理相关因素):Road-related factors (道路相关因素):Interaction-related factors (交互相关因素): 2、Output TypesUnimodal Trajectory Prediction(单一模式…

AI音乐大模型:是创意的助力还是产业的挑战?

近期音乐界迎来了一场前所未有的革命。随着多家科技公司纷纷推出音乐大模型&#xff0c;素人生产音乐的门槛被前所未有地拉低&#xff0c;一个崭新的“全民音乐时代”似乎已近在眼前。然而&#xff0c;在这场技术革新的浪潮中&#xff0c;关于AI产品版权归属、创意产业如何在AI…

前端深拷贝非常优质的函数,包含函数、循环引用,Set、Map、Date、自定义构造函数等处理

前端深拷贝 前端深拷贝非常优质的函数&#xff0c;包含函数、循环引用&#xff0c;Set、Map、Date、自定义构造函数等处理 function deepClone(obj: any, hash new WeakMap()): any {if (Object(obj) ! obj) return obj // 处理基础类型if (hash.has(obj)) return hash.get(…

Python Web实战:Python+Django+MySQL实现基于Web版的增删改查

项目实战 1.创建项目(sms) File->New Project->Django 稍等片刻&#xff0c;项目的目录结构如下图 项目创建后确认是否已安装Django和mysqlclient解释器&#xff0c;如何确认&#xff1f;file->Settings 如果没有请在Terminal终端输入以下命令完成安装 pip instal…

C++初学者指南第一步---5.介绍std::vector

C初学者指南第一步—5.介绍std::vector 目录 C初学者指南第一步---5.介绍std::vector1.初始化/访问2.添加元素3.Resizing调整大小4.在尾部删除元素5. 复制一直是深拷贝&#xff01; 注意std代表C标准库的命名空间&#xff0c;vector&#xff08;向量&#xff09;是标准库中的一…