P39 事件处理

news/2024/5/3 8:37:24/文章来源:https://blog.csdn.net/qq_35132089/article/details/126900498

P39 事件处理

  • 1.事件模型的流程
  • 2.事件监听器
    • 2.1 动作监听器(ActionListener)
    • 2.2 焦点监听器(FocusListener)
    • 2.3 鼠标监听器(MouseListener)
    • 2.4 鼠标移动/拖动监听器(MouseMotionListener)
    • 2.5 鼠标滚轮监听器(MouseWheelListener)
    • 2.6 键盘监听器(KeyListener)
    • 2.7 窗口监听器(WindowListener)

系统:Win10
Java:1.8.0_333
IDEA:2020.3.4
Gitee:https://gitee.com/lijinjiang01/JavaSwing

1.事件模型的流程

为了使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。
在事件处理的过程中,主要涉及三类对象
Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮、窗口、菜单等
Event(事件):事件封装了 GUI 组件上发生的特定事情(通常就是一次用户操作)。如果程序需要获取 GUI 组件上所发生事件的相关信息,都通过 Event 对象来获取
Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种事件做出相应处理
事件流程处理示意图:
在这里插入图片描述

2.事件监听器

事件机制涉及三个成员:事件源、事件和事件监听器,其中事件源使最容易创建的,只需要通过 new 来创建一个组件即可,该组件就是事件源:事件是由系统自动产生的,无需程序员关心。所以实现事件监听器就是整个事件处理的核心

2.1 动作监听器(ActionListener)

动作监听器的动作通常为“点击动作”,常用的组件基本都支持该事件。如果有多个组件都需要设置动作监听器,可以为它们设置同一个实例,再为组件绑定不同的动作命令(ActionCommand)来区分当前触发事件的组件。

final String COMMAND_OK = "OK";
final String COMMAND_CANCEL = "Cancel";JButton okBtn = new JButton("OK");
okBtn.setActionCommand(COMMAND_OK);             // 按钮绑定动作命令JButton cancelBtn = new JButton("Cancel");
cancelBtn.setActionCommand(COMMAND_CANCEL);     // 按钮绑定动作命令// 创建一个动作监听器实例
ActionListener listener = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 获取事件源,即触发事件的组件(按钮)本身// e.getSource();// 获取动作命令String command = e.getActionCommand();// 根据动作命令区分被点击的按钮if (COMMAND_OK.equals(command)) {System.out.println("OK 按钮被点击");} else if (COMMAND_CANCEL.equals(command)) {System.out.println("Cancel 按钮被点击");}}
};// 设置两个按钮的动作监听器(使用同一个监听器实例)
okBtn.addActionListener(listener);
cancelBtn.addActionListener(listener);

2.2 焦点监听器(FocusListener)

一个窗口内的所有组件(包括窗口本身)同一时间只能有一个组件获得焦点。

JButton btn = new JButton("OK");
btn.addFocusListener(new FocusListener() {@Overridepublic void focusGained(FocusEvent e) {System.out.println("获得焦点: " + e.getSource());}@Overridepublic void focusLost(FocusEvent e) {System.out.println("失去焦点: " + e.getSource());}
});JTextField textField = new JTextField(10);
textField.addFocusListener(new FocusListener() {@Overridepublic void focusGained(FocusEvent e) {System.out.println("获得焦点: " + e.getSource());}@Overridepublic void focusLost(FocusEvent e) {System.out.println("失去焦点: " + e.getSource());}
});

2.3 鼠标监听器(MouseListener)

JPanel panel = new JPanel();panel.addMouseListener(new MouseListener() {@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("鼠标进入组件区域");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("鼠标离开组建区域");}@Overridepublic void mousePressed(MouseEvent e) {// 获取按下的坐标(相对于组件)e.getPoint();e.getX();e.getY();// 获取按下的坐标(相对于屏幕)e.getLocationOnScreen();e.getXOnScreen();e.getYOnScreen();// 判断按下的是否是鼠标右键e.isMetaDown();System.out.println("鼠标按下");}@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("鼠标释放");}@Overridepublic void mouseClicked(MouseEvent e) {// 鼠标在组件区域内按下并释放(中间没有移动光标)才识别为被点击System.out.println("鼠标点击");}
});

2.4 鼠标移动/拖动监听器(MouseMotionListener)

JPanel panel = new JPanel();panel.addMouseMotionListener(new MouseMotionListener() {@Overridepublic void mouseDragged(MouseEvent e) {// 鼠标保持按下状态移动即为拖动System.out.println("鼠标拖动");}@Overridepublic void mouseMoved(MouseEvent e) {System.out.println("鼠标移动");}
});

2.5 鼠标滚轮监听器(MouseWheelListener)

JPanel panel = new JPanel();panel.addMouseWheelListener(new MouseWheelListener() {@Overridepublic void mouseWheelMoved(MouseWheelEvent e) {// e.getWheelRotation() 为滚轮滚动多少的度量System.out.println("mouseWheelMoved: " + e.getWheelRotation());}
});

2.6 键盘监听器(KeyListener)

组件监听键盘的按键,该组件必须要获取到焦点。
如果一个窗口内没有可获取焦点的组件,一般打开窗口后焦点为窗口所有,可以把键盘监听器设置到窗口(JFrame)身上。
如果窗口内还有其他组件可获取焦点(例如按钮、文本框),窗口打开后焦点会被内部组件获得,如果想要在窗口打开期间都能监听键盘按键,可以为所有可获得焦点的组件都设置一个键盘监听器。

JFrame frame = new JFrame();frame.addKeyListener(new KeyListener() {@Overridepublic void keyPressed(KeyEvent e) {// 获取键值,和 KeyEvent.VK_XXXX 常量比较确定所按下的按键int keyCode = e.getKeyCode();System.out.println("按下: " + e.getKeyCode());}@Overridepublic void keyTyped(KeyEvent e) {// e.getKeyChar() 获取键入的字符System.out.println("键入: " + e.getKeyChar());}@Overridepublic void keyReleased(KeyEvent e) {System.out.println("释放: " + e.getKeyCode());}
});

2.7 窗口监听器(WindowListener)

窗口监听器只有窗口类组件支持,例如 JFrame、JDialog。

JFrame frame = new JFrame();frame.addWindowListener(new WindowListener() {@Overridepublic void windowOpened(WindowEvent e) {System.out.println("windowOpened: 窗口首次变为可见时调用");}@Overridepublic void windowClosing(WindowEvent e) {System.out.println("windowClosing: 用户试图从窗口的系统菜单中关闭窗口时调用");}@Overridepublic void windowClosed(WindowEvent e) {System.out.println("windowClosed: 窗口调用 dispose 而将其关闭时调用");}@Overridepublic void windowIconified(WindowEvent e) {System.out.println("windowIconified: 窗口从正常状态变为最小化状态时调用");}@Overridepublic void windowDeiconified(WindowEvent e) {System.out.println("windowDeiconified: 窗口从最小化状态变为正常状态时调用");}@Overridepublic void windowActivated(WindowEvent e) {System.out.println("windowActivated: 窗口变为活动状态时调用");}@Overridepublic void windowDeactivated(WindowEvent e) {System.out.println("windowDeactivated: 窗口变为不再是活动状态时调用");}
});// 窗口焦点监听器
frame.addWindowFocusListener(new WindowFocusListener() {@Overridepublic void windowGainedFocus(WindowEvent e) {System.out.println("windowGainedFocus: 窗口得到焦点");}@Overridepublic void windowLostFocus(WindowEvent e) {System.out.println("windowLostFocus: 窗口失去焦点");}
});// 窗口状态监听器
frame.addWindowStateListener(new WindowStateListener() {@Overridepublic void windowStateChanged(WindowEvent e) {System.out.println("windowStateChanged: " + e.getNewState());}
});

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

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

相关文章

SpringAOP的概述与实现

目录 SpringAOP的概述 什么是AOP AOP能干什么 AOP的特点 AOP底层实现 AOP基本概念 连接点 切入点 通知 切面 目标对象 织入 引入 谈谈你对AOP的理解? SpringAOP的实现 依赖引用 spring.xml配置 注解实现 1.定义切面 设置通知 2.开启aop 3.测试 …

金仓数据库KingbaseES客户端编程开发框架-MyBatis(2. 概述 3. MyBatis配置说明)

2. 概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息, 将接口和 Java 的 POJOs(Plain Old Ja…

Sourcemap 配置详解

前言 之前在脚手架工具内整合将sourcemap上传sentry能力的时候,考虑bundle分割对.map文件关联的限制:比如TerserWebpackPlugin(JS压缩)只对 devtool 选项的 source-map,inline-source-map,hidden-source-m…

后端研发工程师面经——JAVA语言

文章目录2. JAVA语言2.1 面向对象的三大特性2.2 JAVA异常2.2.1 异常产生的原因2.2.2 异常的分类2.2.3 异常的处理方式2.3 序列化和反序列化2.3.1 概念2.3.2 JAVA中的序列化和反序列化2.3.3 序列化和反序列化的接口2.3.4 Serialization接口详解2.3.5 Externalizable接口详解2.3.…

3D建模师做多了女人会不会找不到老婆?次世代美少女战士建模流程讲解

什么是次世代? 次世代是个舶来语,“次世代游戏”指代和同类游戏相比下更加先进的游戏,即“下一代游戏”。 次世代是利用高模烘焙的法线贴图回帖到低模上,让低模在游戏引擎里可以及时显示高模的视觉效果。模型面数比较高&#xf…

算法 - 计数排序(Counting_Sort)

目录 引言: 学习: 什么是计数排序(Counting_sort)? 定义: 算法思想: 排序过程: Step 1 : Step 2 : Step 3 : Step 4 : Step 5 &…

单片机项目式实训总篇

采取新方法,让自己尽快变强,为了更好的再次见面。停止大脑内斗。 总学习目标:(完成后此文字支持跳转) 基础知识 端口操作 显示 高级输入 时间控制 综合 Flag: 一周破解C51程序 学习内容: 了解单片…

DeepExploit——当Metasploit遇上机器学习

Metasploit Meets Machine Learning 文章目录Metasploit Meets Machine Learning1. Metasploit准备1.1 与外部项目的合作1.1.1 启用RPC API1.1.2 使用RPC API操作Metasploit2. 创建机器学习模型2.1 DQN2.2 A3C2.2.1 CartPole2.2.2 分布式学习机制3. 深度利用3.1 代理任务3.2 当…

JVM——GC垃圾回收机制

文章目录JVM——GC垃圾回收机制一、如何判断哪些对象应该被回收——对象判活算法引用计数算法可达性分析算法引用最终判定二、对象应该怎么被回收——垃圾回收算法分代收集理论标记-清除算法标记-复制算法标记-整理算法三、内存对象什么时候被回收——触发条件年轻代GC(Minor G…

如期而至的SVN服务器迁移引来一个大瓜XAMPP

文章目录前言方案评估前奏XAMMP搭建svn服务准备软件包安装必要环境和工具安装xampp运行xampp编辑xampp访问xampp安装subversion安装svnmanager创建svn仓库目录修改配置文件为svnmanager创建MySQL用户重启xammp服务访问svnmanager登录svnmanager可能遇到的错误查看服务器目录信息…

10 nginx 中的 slab

前言 这里主要是描述 nginx 中的 slab 内存分配相关 slab 在很多的地方都有使用, 比如 linux, nginx, netty 等等 主要的作用是 内存管理, 复用 简略 nginx 中的 slab 的流程 # slab relatedvoid* poolPtr malloc(2048);ngx_slab_pool_t *pool (ngx_slab_pool_t *)poo…

Pytorch深度学习——线性回归实现 04(未完)

文章目录1 问题假设2 步骤3 学习使用Pytorch的API来搭建模型3.1 nn.Model3.2 优化器类3.3 评估模式和训练模式3.4 使用GPUdata和item的区别1 问题假设 假设我们的基础模型就是y wxb,其中w和b均为参数,我们使用y 3x0.8来构造数据x、y,所以最后通过模型…

0.django部署(基础知识)

我们前面的代码都是在我们自己的电脑(通常是Windows操作系统)上面运行的,因为我们还处于开发过程中。 当我们完成一个阶段的开发任务后,就需要把我们开发的网站服务,给真正的用户使用了。 那就需要我们的 网站 部署在…

【二次分配问题】基于遗传算法 (GA)、粒子群优化 (PSO) 和萤火虫算法 (FA) 求解二次分配( QAP)问题(MATLAB 实现)

目录 1 概述 3 Matlab代码及文章阅读 4 运行结果 4.1 萤火虫算法 4.2 粒子群优化算法 4.3 遗传算法 5 参考文献 1 概述 目前,该问题已经得到深入的研究,进化策略(evolutionstrategies)、遗传算法(genetic algorithms)、遗传规划(geneticprogramm…

警惕利用「以太坊合并」的 3 种骗局

原文作者:茉莉 距离以太坊合并还有不到 6 小时,这条被视作下一代互联网 Web3.0 底层基础设施的区块链网络将彻底改变共识机制,从工作量证明的 PoW 机制转向权益证明的 PoS。 在合并即将到来前,去中心化安全网络市场 PolySwarm 创…

各语言转wasm-js调用

起源是 我司应该是抄袭某家player , 也用wasm做的 , 所以我也研究一下 关于标题 我估计需要大家一起完善了 , 我只会讲一下 go c 别的都不会 webassembly( wasm ) 可以编译的如图 我想起我这边应用啊 也就无非播放器~~ 本地文件压缩啊加密啊或直接就上传了, 或者在操作数据…

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1出现原因 : 这是因为在使用create方法时 , 会有两个选择 , 其中一个已经过时了 client.indices().create(request, RequestOptions.DEFAULT); 其中的create方法 , 有两个版本 , 有一个显示已经过时了 , 两个方法虽然…

蜂蜜什么时候喝,才可以获得蜂蜜更大的好处?真可以治疗咳嗽?

中秋节刚过去不久,家里面的礼品多的是不是可以开超市了?中国人讲究一个“礼”字,逢年过节、探望故友病友手里不带点东西就会难受。中秋节这样带有美好祝愿的节日自然也是中国人送礼的最佳时间之一。 ​ 编辑切换为居中 添加图片注释,不超过…

Google Chrome Privacy Sandbox All In One

Google Chrome Privacy Sandbox All In OneGoogle Chrome Privacy Sandbox All In OneGoogle Chrome 隐私沙盒chrome://settings/privacySandbox With Privacy Sandbox trials, sites can deliver the same browsing experience using less of your info. That means more priv…

需要在html中加CSS,怎么加

在html中加CSS有三种方式 一种是直接写到标签上的style属性里面 <divid"mydiV"style"width:200px;border:1pxsolid#f00;margin:0;"></div> 一种是写到head标签里面的style标签里面 <styletype"text/css"> #mydiV{ width:2…