7.6 事件处理的基本概念
事件处理的几个要素:
事件源:与用户进行交互的GUI组件,表示事件来自于哪个组件或对象;
事件监听器:负责监听事件并做出响应的代码;
事件对象:封装了有关已发生的事件的信息
程序员应完成的两项任务:
为事件源注册一个事件监听器;
实现事件处理方法;
事件源:
提供注册监听器或取消监听器的方法;
如有事件发生,已注册的监听器就会被通知;
一个事件源可以注册多个事件监听器,每个监听器可对多种事件进行响应;
事件监听器:
是一个对象,通过事件源的add xxx Listener方法被注册到某个事件上;
不同的Swing组件可以注册不同的事件监听器;
一个事件监听器中可以包含有对多种具体事件的专用处理方法;
常用事件对象ActionEvent、ItemEvent、ChangeEvent、WindowEvent、MouseEvent;
接口与适配器:
事件监听器接口(xxxListener规定了要响应某类事件必须实现的方法);
事件监听器适配器类(xxxAdapter含有xxxListener中方法的默认实现,只需编写要处理的事件的方法);
事件处理方法:
1.实现事件监听器接口(需实现接口所有方法,不处理的方法可用空花括号);
2,继承事件监听器适配器类(只需重写感兴趣的事件);,3.使用匿名内部类(特别适用于已经继承了某个父类(例如Applet程序,主类必须继承JApplet类或Applet类),则根据Java语法规则,就不能再继承适配器类的情况,而且使用这种方法程序看起来会比较清楚明了);
4.lambda表达式(对于只有一个抽象方法的函数式监听器接口可使用);
7.7 事件派发机制
Swing中的组件不是线程安全的(不能有多个程序段并发操作);
事件派发线程:(串行,保证线程安全)
Swing中的组件是非线程安全的,在Swing中专门提供了一个事件派发线程(EDT)用于对组件的安全访问;
用来执行组件事件处理程序的线程(如按钮的点击事件),依次从系统事件队列取出事件并处理,一定要执行完上一个事件的处理程序后,才会处理下一个事件;
事件监听器的方法都在事件派发线程中执行,如ActionListener的actionPerformed方法;由事件派发线程启动GUI:
可以调用invokeLater或invokeAndWait请事件分发线程以运行某段代码;
要将这段代码放入一个Runnable对象run方法中,并将该对象作为参数传递给invokeLater;
invokeLater是异步的,不用等代码执行完就返回;
invokeAndWait是同步的,要等代码执行完才返回,调用时要避免死锁;