现在使用的仍是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类中,
可以将业务逻辑写在单独的类/接口中,然后在显示逻辑中调用,降低了耦合,后期好维护。