java学习笔记---第8章事件处理
2009-06-09 20:25
375 查看
第八章 事件处理
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 mouseReleased
mouseClicked
MouseEvent对象的getX,getY方法可以获得鼠标被按下时鼠标指针所在的x和y坐标,getClickCount方法区分单击双击或者三击鼠标
Cursor类保存鼠标的样式
MouseListener接口的几个方法的作用域:
mouseDragged()鼠标按钮在组件上按下并拖动时调用,在释放鼠标前,此事件被连续的传递到发起该拖动的组件
mouseMoved鼠标光标移动到组件上但无按键按下时调用
只有鼠标在一个组件内部停留才会调用mouseMoved方法。然后,即使鼠标拖动到组件外边,mouseDragged方法也会被调用
鼠标有两大Listener接口:MouseListener和MouseMotionListener
将鼠标移动事件和拖动事件定义在一个称为MouseMotionListener的独立接口中
l
焦点事件
当java窗口接收到敲击键盘的操作,并定位于某个特定的组件时,这个组件就具有了焦点。在一个窗口中,最多只有一个组件拥有焦点。失去焦点,获得焦点
对组件焦点事件的捕获组要用于核查错误与校验数据
有些组件,在默认情况下无法得到焦点,这是因为它们主要用于装饰或分组。如果希望编写一个程序,能够根据用户的击键操作在面板上绘制图形,就要对默认处理进行覆盖,使用setFocuable(true) 方法
焦点拥有者:拥有焦点的那个组件
焦点窗口:包含拥有者的窗口
活动窗口:包含焦点拥有者的框架或对话框
焦点窗口通常与活动窗口是一样的,只是在焦点拥有者包含在没有框架修饰的顶层窗口中才有所差别
5.
动作
Action接口提供ActionListener接口的一个有用扩展,以便若干控件访问相同的功能
可以在任何需要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.
实现事件源
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 mouseReleased
mouseClicked
MouseEvent对象的getX,getY方法可以获得鼠标被按下时鼠标指针所在的x和y坐标,getClickCount方法区分单击双击或者三击鼠标
Cursor类保存鼠标的样式
MouseListener接口的几个方法的作用域:
mouseDragged()鼠标按钮在组件上按下并拖动时调用,在释放鼠标前,此事件被连续的传递到发起该拖动的组件
mouseMoved鼠标光标移动到组件上但无按键按下时调用
只有鼠标在一个组件内部停留才会调用mouseMoved方法。然后,即使鼠标拖动到组件外边,mouseDragged方法也会被调用
鼠标有两大Listener接口:MouseListener和MouseMotionListener
将鼠标移动事件和拖动事件定义在一个称为MouseMotionListener的独立接口中
l
焦点事件
当java窗口接收到敲击键盘的操作,并定位于某个特定的组件时,这个组件就具有了焦点。在一个窗口中,最多只有一个组件拥有焦点。失去焦点,获得焦点
对组件焦点事件的捕获组要用于核查错误与校验数据
有些组件,在默认情况下无法得到焦点,这是因为它们主要用于装饰或分组。如果希望编写一个程序,能够根据用户的击键操作在面板上绘制图形,就要对默认处理进行覆盖,使用setFocuable(true) 方法
焦点拥有者:拥有焦点的那个组件
焦点窗口:包含拥有者的窗口
活动窗口:包含焦点拥有者的框架或对话框
焦点窗口通常与活动窗口是一样的,只是在焦点拥有者包含在没有框架修饰的顶层窗口中才有所差别
5.
动作
Action接口提供ActionListener接口的一个有用扩展,以便若干控件访问相同的功能
可以在任何需要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.
实现事件源
相关文章推荐
- java学习笔记---第8章事件处理
- Java学习笔记(8) -Java GUI设计与事件处理
- 键盘 事件处理 -Java学习笔记(37)
- 【Java学习笔记】50:DocumentEvent事件的处理
- Java事件处理学习笔记
- Java学习笔记-------事件处理机制
- Java学习笔记--------Java的事件和事件处理接口
- 18. JAVA 图形界面 Part 2(JTextComponent、事件处理、单选按钮、复选框、列表框、下拉列表框、菜单组件、文件选择) ----- 学习笔记
- 【Java学习笔记】49:ItemEvent事件的处理
- 窗口关闭 事件处理 -Java学习笔记(36)
- Java学习笔记(6):事件处理
- JAVA(学习笔记1.2)——事件处理模型
- 【Java学习笔记】48:盒内组件的支撑和ActionEvent事件处理
- java学习:AWT组件和事件处理的笔记(1)--文本框上的ActionEvent事件
- Java学习笔记7——事件处理
- 【Java学习笔记】51:FocusEvent,KeyEvent,WindowEvent事件的处理
- Java学习笔记--AWT事件处理
- Java学习笔记(AWT 之 事件处理机制)
- 【Java学习笔记】52:MouseEvent事件的处理
- Java中文处理学习笔记——Hello Unicode