java学习笔记---第8章事件处理

第八章 事件处理

 

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         键盘事件

    当用户按下键盘上的一个键时,就会产生一个IDKEY_PRESSEDKeyEvent事件。当用户释放一个键时,将会触发IDKEY_PRESSEDKeyEvent事件

KeyListener接口类的三个方法:keyPressed() keyRelease() keyType()

Java明确区分字符和虚拟键码,虚拟键码用VK_表示

keyType()过程报告键入的字符,keyPressed()keyRelease()方法报告用户按下的实际键

在事件上调用getKeyChar()方法得到键入的实际字符

在事件上调用getKeyCode()方法获得一个int 的检查键码

并不是所有的敲击键盘都会产生keyTyped调用。只有那些产生Unicode字符的敲击才能够在keyTyped方法中捕获。可以使用keyPressed方法检查光标键和其他命令键

通常,面板不接受任何键盘事件,可以调用setFocusable方法对默认情形进行覆盖

l         鼠标事件

如果只需要用户点击按钮或菜单,就不需要显示的处理鼠标事件。鼠标操作将由用户界面中的各组件内部处理,并转换成对应的语义事件

用户点击鼠标的三个监听器方法:mousePressed  mouseReleased  mouseClicked

MouseEvent对象的getX,getY方法可以获得鼠标被按下时鼠标指针所在的xy坐标,getClickCount方法区分单击双击或者三击鼠标

Cursor类保存鼠标的样式

MouseListener接口的几个方法的作用域:

mouseDragged()鼠标按钮在组件上按下并拖动时调用,在释放鼠标前,此事件被连续的传递到发起该拖动的组件

mouseMoved鼠标光标移动到组件上但无按键按下时调用

只有鼠标在一个组件内部停留才会调用mouseMoved方法。然后,即使鼠标拖动到组件外边,mouseDragged方法也会被调用

 

鼠标有两大Listener接口:MouseListenerMouseMotionListener

    将鼠标移动事件和拖动事件定义在一个称为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.       实现事件源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值