第八章 事件处理

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{