您的位置:首页 > 编程语言 > Java开发

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.      
实现事件源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息