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时触发ActionListenerActionAdapteractionPerformed
AdjustmentEvent  调节事件移动滑块调节数值值触发AdjustmentListenerAdjustmentAdapteradjustmentValueChanged
ItemEvent选中、取消选中某项时触发ItemListenerItemAdapteritemStateChanged
TextEvent文本框、文本域中的文本发生改变时触发TextListenerTextAdaptertextValueChanged

以上接口中均只有一个抽象方法,若采用匿名内部实现,可使用lambda表达式。

 

 

 

给组件添加事件监听:

component.addXxxListener(XxxListener/XxxAdapter  listener);

 

 

 

实现监听器的4种方式:

1、内部类形式实现

在此外部类中,可复用这个监听器,可直接访问外部类中所有的UI组件。

若外部类中有多个组件要使用此监听器,可使用此种方式。

 

2、匿名内部类形式实现

简便,适合只使用一次的监听器。

 

3、外部类形式实现

监听器属于特定的GUI界面,使用外部类实现监听器,不利于提高程序的内聚性。

且外部类形式的监听器不能访问其他类代表的GUI界面的组件。

但可以被多个类共享。

不推荐。

 

4、类本身作为监听器(实现接口、继承改写适配器)

代码混乱,可读性下降,不推荐。

 

 

类代表的GUI界面主要负责显示逻辑,尽量不要将业务逻辑直接写在GUI类中,

可以将业务逻辑写在单独的类/接口中,然后在显示逻辑中调用,降低了耦合,后期好维护。

 

点赞