java事件处理

使用eventhandler类创建一个监听器

loadButton.addActionListener(EventHandler.create(ActionListener.class,frame,"loadData"));这里要调用frame.loadData方法。

如果loadData需要参数可以有另外一种create方法。

 

动作

通常激活一个命令可以有多种方式,用户可以通过菜单,点击按钮,或者工具栏上的按钮选择特定的功能,在AWT事件模型中实现比较容易,间所有事件连接到同一个监听器上,比如将一个监听器对象加到下面几个事件源上

标记为blue的工具栏按钮

标记为blue的菜单项

击键CTRL+B

 

在swing包中提供了一种非常实用的机制来封装命令,并将它们连接到多个事件源上,这就是ACTION接口。AbstractAction已经实现了接口中的许多方法。继承abstractAction类后,可以把对象直接给jbutton的构造器,其中一个构造器可以接受action接口对象,这样里面的名字,图标会被自动读取显示在按钮上,而action对象也被设定为监听器。想要吧这个动作对象加到击键中,以便让用户敲击键盘命令来执行这个动作。为了将动作击键关联起来,首先要生成keyStroke类对象。这个类封装了对键的说明,这个类有静态的getKeyStroke可以生成对象。

 

下个步骤就是要理解一下keyboard focus的概念。在一个界面中可以有很多组件,在一个时间只有一个组件拥有焦点,但是击键并不想发送给拥有焦点的组件。否则每个组件都要知道如何处理特定的组合键。 对此swing设计了一个很便捷的解决方法。每个jcomponent有3个输入映射 input maps ,每个映射的keystroke对象都与动作关联,三个映射对应着三个不同的条件。

击键处理按照下列顺序检查映射。

1.检查具有焦点组件的when focus映射,如果这个击键存在,就执行对应的动作,如果已经启动动作,停止处理。

2.从具有焦点的组件开始,检查其父组件的when Ancestor映射,一旦找到击键对应的映射,就执行对应的动作,如果动作已经启动,就停止处理。

3.从具有焦点的窗口中所有可视的和启用的组件查看,这个击键被注册到when in focus映射中,按照击键注册的顺序给这些组件一个执行对应动作的机会,一旦第一个启动的动作被执行,那么就停止处理。如果一个击键在多个when in focus windows 映射中出现,那么这部分处理就可能出现问题就冲突了。

 

使用getInputMap方法从组件中得到输入映射。inputmap imap = panel.getInputMap(when_focused)这意味着在当前组件具有焦点时候会查看这个映射。 inputmap不能直接的将keystroke对象映射到action对象。而是先映射到任意对象上,然后由Actionmap类实现将对象映射到动作上。这样很容易实现来自不同输入映射的击键共享一个工作的目的。因而每个组件可以有三个输入映射,和一个动作映射。为了将他们组合起来,需要为动作命名。下面就是将键与动作关联起来的方法

imap.put(KeyStroke.getKeyStroke("ctrl Y"),"panel.yellow");

Actionmap amap=panel.getActionMap();

amap.put("panel.yellow",yellowAction);

 

下面总结一下用动作相应按钮菜单项或者击键的方式

1.实现一个扩展AbstractAction类的类,多个相关动作可以使用统一各类。

2.构造一个动作类对象

3.使用动作对象创建按钮或者菜单项,构造器可以从动作对象中读取标签文本和图标。

4.为了能够通过击键触发动作,必须额外的执行几步操作,首先定位顶层窗口组件,例如包含所有其他组件的面板。

5.然后得到顶层组件的when ancestorof focus component输入映射,为需要的击键创建一个keystroke对象,创建一个描述动作字符串这样的动作键对象,将击键和动作键对添加到输入映射中。

6.得到顶层组件的动作映射,将 动作键 动作对象 添加到映射中。

 

最后给出AWT事件类的继承关系图

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值