第11章:事件处理
11.1 事件处理基础
- 监听器(listener)对象是一个实现了特定监听器接口(listener interface)的类的实例
- 事件源是一个能够注册监听器对象并发送事件对象的对象
- 当事件发生时,事件源将事件对象传递给所有注册的监听器
- 监听器对象将利用事件对象中的信息决定如何对事件做出响应
11.2 动作
将所有时间连接到同一个监听器上,这个监听器必须是实现了ActionListener接口的实例。比如我们可以将一个blueAction添加到
- 标记为blue的工具栏按钮
- 标记为blue的菜单项
- 按键ctrl B
这样我们使得代码大大简化 ,并且可以利用Action类中的一些方法实现特殊的功能。
Action接口详解:一个动作(Action)是一个封装下列内容的对象:
- 命令的说明(一个文本字符串和一个可选图标)
- 执行命令所需要的参数(上例中所要改变的颜色)
Action接口包含的方法
- void actionPerformed(ActionEvent event)
扩展自Actionlistener接口 - void setEnable(Boolean b)
根据b的值决定是否启用本对象 - void isEnable()
询问动作是否启用 - void putValue(String key, Object value)
使一个关键字与一个值对应起来,系统自定义了几个关键字,用于描述动作。
key的值可以是预定义动作表中的值,也可以是自己定义的字符串。
预定义动作表的值如下所示
NAME :动作名称
SMALL_ICON: 存储小图标
SHORT_DESCRIPTION: 简要说明,当鼠标移到对应组件上面时会提示用户
MNEMONIC_KEY: 快捷键缩写,显示在JMenuItem上面 - Object getValue(String key)
得到关键字对应的值 - void addPropertyChangeListener(PropertyChangeListener listener)
- void removePropertyChangeListener(PropertyChangeListener listener)
将一个动作与键盘事件关联起来
每一个JComponent都有三个映射
- WHEN_FOCUSED 当这个组件拥有键盘焦点时
- WHEN_ANCESTOR_OF_FOCUSED_COMPONENT当这个组件包含了拥有键盘焦点的组件时
- WHEN_IN_FOCUSED_WINDOW当这个组件被包含在一个拥有键盘焦点组讲的窗口中时
示例代码如下:
InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);
imap.put(KeyStroke.getKeyStroke("ctrl B","blue");
ActionMap amap = panel.getActionMap();
amap.put("blue", blueAction);
11.3 鼠标事件
鼠标点击时发生了什么
- mousePressed 鼠标按下时调用
- mouseReleased 鼠标被释放时调用
- mouseClicked 一次鼠标事件完成时调用
当需要使用ctrl,alt,shift等按键与鼠标事件组合使用时
- 采用掩码的方式,有BUTTON1_DOWN_MASK,BUTTON_DOWN_MASK,BUTTON3_DOWN_MASK,SHIFT_DOWN_MASK等很多掩码
- 调用event.getModifiersEx()得到当前时间的操作码,与上述掩码进行‘&’操作,判断是否按下
改变光标的形状
- setCursor