第八章 事件处理
1.事件处理基础
l在AWT所知的事件范围内,全面能够扼制事件从事件源到事件监听器的递交过程,并将任何对象支使给事件监听器
事件源有一些向其登记事件监听器的措施,当某个事件源产***件的时候,事件源会向为事件登记的所有事件监听器对象发送一个通知
不同的事件源能够发生不同种类的事件
AWT事件处理机制梗概:
监听器对象是一个告终了特定监听器接口的类的实例
事件源是一个能够登记监听器对象并发送事件对象的对象
当事件发生时,事件源将事件对象递交给所有登记的监听器
监听器对象将利用事件对象中的消息定夺如何对事件作出相应
为了告终ActionListener接口,监听器类定然有一个被称为actionPerformed()的措施
能够将多个监听器对象增加到一个像按钮这么的事件源中
l实例:处理按钮点击事件
ActionListener接口并不但限于按钮点击事件,还能够利用于:
批准鼠标双击的措施抉择了列表框中的一个选项时
抉择一个菜单项时
在文本域中敲击enter键时
对于一个Timer组件来说,当到达指定的工夫间隔时
l提倡利用内部类
我们提倡为事件处理设计一个专程的内部类,而不要将一个曾经存在的类转换为监听器,即便匿名内部类也有定然的利用市场
内部类机制将积极地生成一个构造器,其中存储着所有用在内部类措施中的final大局变量
凡是事件处理器包括的语句条数不多,就感受这段代码的可读性还是不错,尤其是在对内部类机制未曾什么抵触心理的情形下
l将组件变成事件监听器
任何告终了ActionListener接口的类对象都能够作为按钮监听器
找到因事件而改换的组件,然后让这些组件告终ActionListener接口,并添置actionPerformed措施
利用getSource措施能够给出每个事件的事件源。事件源是产***件和通知监听器的对象
这种措施必需包括按钮的面板具有一个保留按钮引用的实例域
当面板包括多个用户界面元素时,将变得额外混乱,不评比利用
l改换观感:
在默认情形下,Swing过程利用Metal观感,能够批准两种措施改换观感:
在java子目录jre/lib下的swing.properties将属性swing.default设置为所渴望的观感类名
动态的改换观感:①调用静态的UIManager.setLookAndFeel措施
②调用静态措施SwingUtilities.updateComponentTreeUI来刷新全副组件集,加载时要抛出一个失常
罗列所有观感的措施:
UIManager.getInstalledLookAndFeel()
l捉拿窗口事件
告终一个接口定然告终该接口的所有措施,意味着有些事件监听类要告终许多措施,而许多大约就无须要,此刻我们就引入了适配器类
处于简化目标,每个含有多个措施的AWT监听器接口都配有一个适配器类,这个类告终了接口中的所有措施,但每个措施未曾作任何事情。适配器积极的中意了java告终相干监听器接口的技巧需求,能够穿越伸展适配器来指定对某些事件的响应动作,而无须告终接口中的每个措施(但ActionListener接口只有一个措施,因而未曾必需的适配器)
能够利用匿名内部类的措施告终适配器
2.AWT事件继承层次
Java事件处理批准的是面向对象的措施,所有的事件都是由java.util包中的EventObject类伸展而来的
在通用的事件处理过程中,普遍利用的还是大约的awt监听器接口
3.AWT语义事件和低级事件
AWT将事件分为低级事件和语义事件
语义事件:表白用户动作的事件
低级事件:构成那些事件的事件
Java.awt.event包中最常用的语义事件:
ActionEvent 按钮点击、菜单抉择、抉择列表项、在文本域中键入enter
AdjustEvent 调剂滚动条
ItenEvent 从复选框或列表项入抉择一项
常用的5个低级事件类:
KeyEvent 一个键被按下或释放
MouseEvent 鼠标被按下、释放、挪动或拖动
MouseWheelEvent 鼠标滚轮被转动
FocusEvent 某个组件获得焦点或错过焦点
WindowEvent 窗口事态改换
语义事件只有一个告终的措施,而低级事件经常有多个要告终的措施
事件源是用户界面组件、窗口和菜单。垄断系统会将用户的动作通知给相干的事件源。
事件源还保留着一组监听器,这是事件发生时必需调用的对象。事件发生后,事件源调用监听器接口的相应措施,以便将事件的相干消息递交给不同的监听器。事件源穿越将相应的事件对象递交给监听器中的措施来告终这一点。监听器分析事件对象,以便获得与事件相干的翔实消息
所有低级事件都继承于ComponentEvent类,这个类的getComponent措施的重要用处是报告哪个组件发生了事件。
4.低级事件种类
l键盘事件
当用户按下键盘上的一个键时,就会发生一个ID为KEY_PRESSED的KeyEvent事件。当用户释放一个键时,将会引发ID为KEY_PRESSED的KeyEvent事件
KeyListener接口类的三个措施:keyPressed() keyRelease()keyType()
Java确定判别字符和虚构键码,虚构键码用VK_表示
keyType()过程报告键入的字符,keyPressed()和keyRelease()措施报告用户按下的切实键
在事件上调用getKeyChar()措施获得键入的切实字符
在事件上调用getKeyCode()措施获得一个int 的察看键码
并不是所有的敲击键盘都会发生keyTyped调用。只有那些发生Unicode字符的敲击能力够在keyTyped措施中捉拿。能够利用keyPressed措施察看光标键和其他号召键
等闲,面板不接受任何键盘事件,能够调用setFocusable措施对默认情形举行遮蔽
l鼠标事件
万一只必需用户点击按钮或菜单,就无须要揭示的处理鼠标事件。鼠标垄断将由用户界面中的各组件内部处理,并转换成对应的语义事件
用户点击鼠标的三个监听器措施:mousePressed mouseReleasedmouseClicked
MouseEvent对象的getX,getY措施能够获得鼠标被按下时鼠标指针所在的x和y坐标,getClickCount措施判别单击双击可能三击鼠标
Cursor类保留鼠标的款式
MouseListener接口的几个措施的作用域:
mouseDragged()鼠标按钮在组件上按下并拖动时调用,在释放鼠标前,此事件被继续的递交到发动该拖动的组件
mouseMoved鼠标光标挪动到组件上但无按键按下时调用
只有鼠标在一个组件内部逗留才会调用mouseMoved措施。然后,即便鼠标拖动到组件外边,mouseDragged措施也会被调用
鼠标有两大Listener接口:MouseListener和MouseMotionListener
将鼠标挪动事件和拖动事件定义在一个称为MouseMotionListener的自力更生接口中
l焦点事件
当java窗口接收到敲击键盘的垄断,并定位于某个特定的组件时,这个组件就具有了焦点。在一个窗口中,最多只有一个组件具有焦点。错过焦点,获得焦点
对组件焦点事件的捉拿组要用于核对讹谬与校验数据
有些组件,在默认情形下无法获得焦点,这是因为它们重要用于修饰或分组。万一渴望编写一个过程,能够依据用户的击键垄断在面板上描摹图形,即将对默认处理举行遮蔽,利用setFocuable(true) 措施
焦点具有者:具有焦点的那个组件
焦点窗口:包括具有者的窗口
行动窗口:包括焦点具有者的框架或对话框
焦点窗口等闲与行动窗口是一样的,只是在焦点具有者包括在未曾框架修饰的顶层窗口中才有所差异
5www.free3go.info.动作
Action接口供给ActionListener接口的一个有用伸展fr.frptanks.net,以便若干控件拜会雷同的功能
能够在任何必需ActionListener对象的地方利用Action对象
Action接口的putValue() 和 getValue()措施批准存储和检索动作对象中的任意名/值对
万一动作对象被增加到菜单可能工具栏上,它的名目和图标就会积极地提取出来,并揭示在菜单项或工具栏项中
AbstractAction类告终了Action接口除actionPerformed()措施之外的所有措施
击键处理将按照下列次序察看这些照射:
1 )察看具有输入焦点的WHEN_FOCUSED照射,万一这个击键存在,将厉行对应的动作
2)从具有输入焦点的组件开始,察看其父组件的WHEN_ANCESTOR_OF_FOCUSED_COMPONENT照射。
3 )察看具有输入检点的窗口中的所有可视的和启用的组件,这个击键被登记到WHEN_IN_FOCUSED_WINDOW照射中。
用统一个动作响应按钮、菜单项或击键的措施:(动作的告终措施)
1)告终一个伸展与AbstractAction类的类。多个相干动作能够利用统一个类
2)构造一个动作类的对象
3)利用动作对象创立按钮或菜单项。构造器将从动作对象中读取标签文本和图标
4)为了能够穿越击键引发动作,定然额外地厉行几步垄断
5)获得顶层组建的WHEN_ANCESTOR_OF_FOCUS_COMPONENT输入照射。为必需的击键创立一个KeyStrick对象。创立一个描写动作字符串这么的动作键对象。将击键、动作键对增加到输入照射中
6)获得顶层组件的动作照射,将动作键,动作对象增加到照射中
6.多点递交
所有的AWT事件源都扶持监听器的多点递交模型,这意味着统一个事件能够发送给多个监听器对象
API不能保证一个给定事件源登记的一组监听器递交事件的次序,因而,不要编写依靠递交次序的过程逻辑
7.告终事件源values should never*be negative.*/ public class Example{