用、判断行为可用的状态、设置和取得行为的一些属性,最后两个方法用来允许其他对象在行动对象的属性发生变化后得到通知。
通常我们使用一个实现了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);
}
}
Java Swing中的键盘事件处理(2)
时间:2010-12-19
建立四个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是有 |