使用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事件类的继承关系图 |
|