频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

Java Swing中的键盘事件处理

来源:yesky 作者:郗旻 出处:巧巧读书 2006-06-03 进入讨论组

  行为是一个实现了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环境安装配置数据库处理专题Java编程开发手册专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章