第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都有三个映射

  1. WHEN_FOCUSED 当这个组件拥有键盘焦点时
  2. WHEN_ANCESTOR_OF_FOCUSED_COMPONENT当这个组件包含了拥有键盘焦点的组件时
  3. 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