通常,激活一个命令可以有多种方式,用户可以通过菜单、击键或工具栏上的按钮选择特定的功能。在AWT事件模型中实现这些非常容易:将所有事件 连接到同一个监听器上。例如:假设blueAction是一个动作监听器,它的actionPerformed方法可以将背景颜色改变成蓝色。将一个监听 器对象加到下面几个事件源上:
1.标记为Blue的工具栏按钮
2.标记为Blue的菜单项
3.击键CTRL+B
然后,无论改变背景颜色的命令是通过哪种方式下达的,是点击按钮、菜单选择,还是按下键盘,其操作动作都是一样的。
Swing包提供了一种非常实用的机制来封装命令,并将它们连接到多个事件源,这就是Action接口。一个动作是一个封装下列内容的对象:
命令的说明(一个文本字符串和一个可选图标);
执行命令所需要的参数(例如,在列举的例子中请求改变的颜色)。
第一个方法是ActionListener接口中很熟悉的一个:实际上,Action接口扩展于ActionListener接口,因此,可以在任何需要ActionListener对象的地方使用Action对象。
接下来的两个方法允许启用或禁用这个动作,并检查这个动作当前是否启用。当一个连接到菜单或工具栏上的动作被禁用时,这个选项就会变成灰色。
putValue和getvalue方法允许存储和检索动作对象中的任意名/值。有两个重要的预定义字符串:Action.NAME和Action.sMALLjcON,用于将动作的名字和图标存储到一个动作对象中。
如果动作对象添加到菜单或工具栏上,它的名称和图标就会被自动地提取出来,并显示在菜单项或工具栏中。SHORT_DESCRiRTION值变成了工具提示。
Action接口的最后两个方法能够让其他对象在动作对象的属性发生变化时得到通告,尤其是菜单或工具栏处罚的动作。例如,如果增加一个菜单,作为动作 对象的属性变更监听器,而这个动作对象随后被禁用,菜单就会被调用,并将动作名称变为灰色。属性变更监听器是一种常用的构造形式,它是JavaBeans 组件模型的一部分。
需要注意,Action一个接口,而不是一个类。实现这个接口的所有类都必须实 现刚才讨论的7个方法。庆幸的是,有一个类实现了这个接口除actionPerformed方法之外的所有方法,它就是AbstractAction个类 存储了所有名/值对,并管理着属性变更监听器。我们可以直接扩展AbstractAction类,并在扩展类中实现actionPerformed方法。
构造器读取动作的名称和图标,为工具提示设置简要说明,将工作设置为监听器。
最后,想要将这个动作对象添加到击键中,以便让用户敲击键盘命令来执行这项动作。为了将动作与击键关联起来,首先需要生成KeyStroke类对象。这 是一个很有用的类,它封装了对键的说明。要想生成一个Keystroke对象不要调用构造器,而是调用KeyStroke类中的静态 getKeyStroke方法:
为了能够理解下一个步骤,需要知道keyboardfocus的概 念。用户界面中可以包含许多按钮、菜单、滚动栏以及其他的组件。当用户敲击键盘时,这个动作会被发送给拥有焦点的组件。通常具有焦点的组件可以明显地察觉 到(但并不总是这样),例如,在Java观感中,具有焦点的按钮在按钮文本周围有一个细的矩形边框。用户可以使用TAB键在组件之间移动焦点。当按下 SPACE键时,就点击了拥有焦点的按钮。还有一些键执行一些其他的动作,例如,按下箭头键可以移动滚动条。
然而,在这里的示例中,并不希望将击键发送给拥有焦点的组件。否则,每个按钮都需要知道如何处理CTRL+Y、CTRL+B和CTRL+R这些组合键。
这是一个常见的问题,Swing设计者给出了一种很便捷的解决方案。每个JComponent有三个输入映射(imput maps),每一个映射的KeyStroke对象都与动作关联。
注:转载本文请注明出处http://www.ocean-ad.cn澳煦互动