Java GUI 事件监听
现在使用的仍是AWT的事件模型。涉及到3类对象:
- Event Source:事件源,即事件发生所在的组件
- Event:事件,封装了此次事件的相关信息
- Event Listener:事件监听器,监听事件,发生指定事件时自动调用对应的方法
监听器可以继承接口自己写代码实现,也可以继承适配器(空实现),然后只重写部分方法的实现。
事件可分为2类:
1、低级事件:基于具体的动作,包括
事件 | 触发条件 | 监听器 | 适配器 | 方法 |
KeyEvent 键盘事件 | 按下、松开、单击键盘上的某个键时触发 | KeyListener | KeyAdapter |
keyPressed:按下某个键时触发 keyReleased:松开某个键时触发 keyTyped:单击某个键时触发 |
MouseEvent 鼠标事件 |
MouseListener MouseMotionListener |
MouseAdapter MouseMotionAdapter |
MouseListener的5个方法: mousePressed:按下某个鼠标键时触发 mouseReleased:松开某个鼠标键时触发 mouseClicked:单击某个鼠标键时触发 mouseEntered:鼠标移入该组件时触发 mouseExited:鼠标移出该组件时触发 MouseMotionListener的2个方法: mouseMoved:在该组件上移动鼠标时触发 mouseDragged:在该组件上按下某个鼠标键并移动鼠标时触发,如在画布上画图 |
|
FocusEvent 焦点事件 | 获得焦点、失去焦点时触发 | FocusListener | FocusAdapter |
focusGained:获取焦点时触发 focusLost:失去焦点时触发 |
WindowEvent 窗体事件 |
打开窗口、关闭窗口, 窗口最大化、最小化时触发 |
WindowListener | WindowAdapter |
windowOpened:打开窗口时触发 windowClosing:单击右上角的“X”时触发 windowClosed:调用dispose()释放窗体资源时触发 windowDeactivated:窗口失活(失去焦点)时触发 windowDeiconified:窗口重新获得焦点时触发(恢复) windowActivated:窗口被激活(获得焦点)时触发,首次+恢复 windowIconified:窗口最小化时触发 |
ContainerEvent 容器事件 | 往容器中添加、移除组件时触发 | ContainerListener | ContainerAdapter |
componentAdded:往容器中添加组件时触发 componentRemoved:从容器中移除组件时触发 |
ComponentEvent 组件事件 |
组件的尺寸发生变化、 位置发生改变、 组件被隐藏/显示时触发 |
ComponentListener | ComponentAdapter |
componentResized:组件尺寸发生变化时触发 componentMoved:组件的位置发生改变时触发 componentHidden:组件被隐藏时触发 componentShown:组件被显示时触发 |
PaintEvent 组件绘制事件 | 调用组件的paint()/update()来绘制时触发 |
2、高级事件(语义事件),不和具体的动作关联,只表示发生了该事件,包括:
事件 | 触发条件 | 监听器 | 适配器 | 方法 |
ActionEvent 动作事件 | 按钮、菜单项、输入框被单击/手动Enter时触发 | ActionListener | ActionAdapter | actionPerformed |
AdjustmentEvent 调节事件 | 移动滑块调节数值值触发 | AdjustmentListener | AdjustmentAdapter | adjustmentValueChanged |
ItemEvent | 选中、取消选中某项时触发 | ItemListener | ItemAdapter | itemStateChanged |
TextEvent | 文本框、文本域中的文本发生改变时触发 | TextListener | TextAdapter | textValueChanged |
以上接口中均只有一个抽象方法,若采用匿名内部实现,可使用lambda表达式。
给组件添加事件监听:
component.addXxxListener(XxxListener/XxxAdapter listener);
实现监听器的4种方式:
1、内部类形式实现
在此外部类中,可复用这个监听器,可直接访问外部类中所有的UI组件。
若外部类中有多个组件要使用此监听器,可使用此种方式。
2、匿名内部类形式实现
简便,适合只使用一次的监听器。
3、外部类形式实现
监听器属于特定的GUI界面,使用外部类实现监听器,不利于提高程序的内聚性。
且外部类形式的监听器不能访问其他类代表的GUI界面的组件。
但可以被多个类共享。
不推荐。
4、类本身作为监听器(实现接口、继承改写适配器)
代码混乱,可读性下降,不推荐。
类代表的GUI界面主要负责显示逻辑,尽量不要将业务逻辑直接写在GUI类中,
可以将业务逻辑写在单独的类/接口中,然后在显示逻辑中调用,降低了耦合,后期好维护。
Java GUI 事件监听的更多相关文章
- JAVA GUI 事件监听事件 详解 和 案例.
GUI(图形用户界面) Graphical User Interface(图形用户接口) 用图形的 方式, 来显示 计算机操作的 界面, 这样更方便 更直观. CLI Command Line Use ...
- [置顶] java Gui 键盘监听事件
简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...
- JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件
JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...
- GUI编程笔记(java)05:GUI事件监听机制原理和举例说明
1.事件监听机制: A:事件源 事件发生的地方 B:事件 就是要发生的事情 C:事件处理 就是针对发生的事情做 ...
- JAVA自定义事件监听完整例子---sunfruit[转]
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f733628a854d2c90c05f9313071601 ...
- JAVA Swing 事件监听
EventListner 接口 它是一个标记接口,每一个监听器接口扩展.这个类定义在java.util包. 类声明 以下是声明java.util.EventListener接口: public int ...
- Java界面编程—事件监听机制
组件首先要先注册事件处理器,当用户单击组件.移动鼠标或者敲击键盘时都会产生事件(Event),一旦有时间发生,应用程序就会做出对该事件的响应,这些组件就是事件源(Event source). 接受.解 ...
- Java事件监听的四种实现方式
1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是触发事件的源头,不同的事件源会触发不同的事件类型. 3.事件监听器: 事件监听器负责监听 ...
- java Gui编程 事件监听机制
1. GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式: 1. 命令交互方式 图书管理系统 ...
随机推荐
- 关于C语言声明数组时省略长度
C语言在声明数组时必须明确长度,如下两种方式: (一) 直接指定长度.如: int a[5]; (二) 声明时初始化元素.如:int a[]={1,3,5}. 如果,直接int a[]; 是不可以的 ...
- No java virtual machine ....
运行Eclipse提示No java virtual machine 版权声明:本文原创作者:一叶飘舟 作者博客地址:http://blog.csdn.net/jdsjlzx http://blo ...
- P1115最大子段和
题目:https://www.luogu.org/problemnew/show/P1115 很简明的一道题: 这里用了递归分治,然而似乎还有更简单的做法(贪心). 代码如下: #include< ...
- KVM虚拟机内无agent情况下的监控方法
KVM虚拟机内无agent情况下的监控(ceilometer实现) 今天看到大家在群里讨论KVM虚拟机的监控问题,而且是要求VM内无agent情况下的监控.这方面确实没有深入研究,但尚有些openst ...
- SpringMVC数据绑定二(List、Set和Map类型)
1.List类型绑定 //联系信息类 用户类的子属性 public class ContactInfo { private String phone; private String address; ...
- Validtion
今天在使用Validation框架实现验证时,出现以上的错误.查询资料后发现“validation-config.dtd”这个文件没有导入自己的工程,才会出现这样的错误. 将从文件导入后果然解决了问题 ...
- UVa 820 Internet Bandwidth (裸板网络流)
题意:有一个计算机网络,输入节点数n,输入网络流源点和汇点src,des,再输入双向边数m.给出m条边的负载,求最大流. 析:直接上网络流的最大流. 代码如下: #pragma comment(lin ...
- Asp.net后台创建HTML
为了使HTML界面中的内容能根据数据库中的内容动态显示用户需要的内容,或者根据权限不同要显示同而实现页面内容的动态创建 使用HtmlGenericControl创建HTML标签 引入命名空间: usi ...
- CodeForces 363D 【二分+贪心】
思路: 一开始是没有办法贪心的,但是答案是可以二分的,因为窝能买k辆车的话,窝就一定能买k-1辆车:而且我最好就是拿手上钱较多的那些人去买价格便宜的车,这样肯定是能买到最多的车,而且花的少,因为对于要 ...
- layui icon样式1到7
1: 2: 3: 4: 5: 6: 7: