行为是一个实现了Action接口的类。在Action接口中定义了7个方法。其中最关键的是actionPerformed()方法。这个方法描述了这个行为的具体操作过程。其他几个方法包括setEnabled,isEnabled,putValue,getValue,addPropertyChangeListener,和removePropertyChangeListener方法。他们分别用来设置行为是否可用、判断行为可用的状态、设置和取得行为的一些属性,最后两个方法用来允许其他对象在行动对象的属性发生变化后得到通知。
通常我们使用一个实现了Action接口的大部分方法的抽象类AbstractAction类作为基类,重载actionPerformed方法以实现我们的行为。
我们用一个例子来具体说明如何进行实际的操作。
首先编写一个具体的行为,对指定的键盘事件进行处理:
| public class TextAction extends AbstractAction { private String a; public TextAction(String a) { this.a = a; } public void actionPerformed(ActionEvent parm1) { String b = parm1.getActionCommand(); //得到行为的命令字符串 System.out.println("command="+b); System.out.println("prompt="+this.a); } } |
建立四个TextAction对象:
| TextAction whenFocusSon = new TextAction("focus son"); TextAction whenFocusFather = new TextAction("focus father"); TextAction window = new TextAction("window"); TextAction ancestor = new TextAction("ancestor"); |
随后,在一个窗体中加入两个面板,名为sonPanel和parentPanel,使得parentPanel是sonPanel的祖先。并在sonPanel中加入一个名为son的button,在parentPanel中加入名为parent的button。在fatherPanel外加入几个button。
得到son组件的三个InputMap,并创建一个名为focusFatherIm的InputMap,使得这个InputMap成为focusIm的parent:
| //get default inputMap (when focus inputmap) and set a parent InputMap focusIm = son.getInputMap(); focusFatherIm = new InputMap(); focusIm.setParent(focusFatherIm); //get WHEN_ANCESTOR_OF_FOCUSED_COMPONENT inputMap ancestorIm = son.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); //get WHEN_IN_FOCUSED_WINDOW inputMap windowIm = son.getInputMap(WHEN_IN_FOCUSED_WINDOW); 在这些InputMap中分别加入键盘绑定: focusIm.put(KeyStroke.getKeyStroke('f'),"actionFocusSon"); focusFatherIm.put(KeyStroke.getKeyStroke('F'),"actionFocusFather"); ancestorIm.put(KeyStroke.getKeyStroke('a'),"actionAncestor"); windowIm.put(KeyStroke.getKeyStroke('w'),"actionWindow"); 得到son组件的缺省的ActionMap,并将已经建立的行为与特定的对象(字符串)进行绑定: am = son.getActionMap(); am.put("actionFocusSon",whenFocusSon); am.put("actionFocusFather",whenFocusFather); am.put("actionAncestor",ancestor); am.put("actionWindow",window); |
运行程序及其相应结果:
1, 单击son按钮,这时如果按下'f','F','a','w',程序均会有相应的输出。这是因为,此时的焦点在son按钮上,而son按钮组件的三个InputMap都是有效的。所以他们对应的事件都会发生。
2, 单击parent按钮,这时按下'w',程序会有相应的输出。而按下'f','F','a',程序没有反应。这是因为parent按钮具有焦点,这个按钮不是son按钮的祖先,而son所在的窗口具有焦点,所以只有组件所在窗口具有焦点的InputMap是有效的。
3, 单击其他的按钮(parentPanel外的按钮),这时按下'w',程序会有相应的输出。而按下'f','F','a',程序没有反应。这是因为这些按钮具有焦点,他们不是son按钮的祖先,而son所在的窗口具有焦点,所以只有组件所在窗口具有焦点的InputMap是有效的。本U R L:http://www.qqread.com/java/2006/06/w780115002.html
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Java环境安装配置 (5627篇文章)
- 数据库处理专题 (8607篇文章)
- Java编程开发手册 (8276篇文章)
- 掌握JAVA的标准 (26次浏览)
- JAVA编译时的常见错误 (25次浏览)
- Ubuntu Linux系统中Java环境的安装配置 (25次浏览)
- 如何在MyEclipse快速搭建Hibernate应用 (15次浏览)
- Nhibernate与代码生成器介绍 (14次浏览)
- 高手为你分析类的设计方法 (12次浏览)
- Java中利用反射实现类的动态加载 (12次浏览)
- JAVA运行时的产间错误 (11次浏览)
- J2SE综合:浅谈java程序发布之 jre 篇 (11次浏览)
- Java敏捷开发技巧之消除代码异味 (10次浏览)



