一、Java的事件处理机制
二、事件处理流程
1、给事件源对象注册监听者
事件监听者是在事件发生时要对事件进行处理的对象。AWT定义了各种类型的事件,每一种事件有相应的事件监听者接口 ,在接口中描述了处理相应事件应该实现的基本行为。若事件类名为XxxEvent,则事件监听接口的命名为XxxListener,给部件注册监听者的方法为addXxxListener(XxxListener a)。
列子:只要用户点击按钮,JButton对象就会创建一个ActionEvent对象,然后调用listener.actionPerformed(event)传递事件对象。
内嵌类的方法:
MyListener listener = new MyListener();
JButton button = new JButton("OK");
button.addActionListener(listener);
class MyListener implements ActionListener{
...
public void actionPerformed(ActionEvent event){
...
}
}
lambda 表达式:
exitButton.addActionListener(event -> Systeu.exit(O));
使用匿名类:
exitButton.addActionListener(new ActionListener()
{
public void actionPerformed(new ActionEvent)
{
System.exit(0);
}
});
2、给监听者编写事件处理代码
3、发生事件时调用监听者的方法进行相关处理
java的事件处理机制称为委托事件处理,事件源发生事件时由监听者处理。监听者中定义事件处理方法,事件源不需要实现任何接口,但其内部有个列表记录该事件源注册了哪些监听者,从而保证发生事件时能去调用监听者的方法。
三、适配器类adapter:
鉴于简化的目的,每个含有 多个方法的 AWT 监听器接口都配有一个适配器(XxxAdapter) 类,这个类实现了接口中的所有方 法, 但每个方法没有做任何事情。可以通过继承适配器类来指定对某些事件的响应动作,而不必实现接口中的每 个方法(ActionListener 这样的接口只有一个方法,因此没必要提供适配器类)。
内部类方法:
class Terminator extends WindowAdapter
{
public void windowCIosing(WindowEvent e)
{
if {useragrees) System.exit(O);
}
}
frame.addWindowListener(new Terminator());
匿名内部类方法:
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if (useragrees) System.exit(0);
}
});
四、动作
通常, 激活一个命令可以有多种方式。用户可以通过菜单、击键或工具栏上的按钮选择 特定的功能。在 AWT 事件模型中实现这些非常容易:将所有事件连接到同一个监听器上。
Swing包提供了一种非常实用的机制来封装命令,并将它们连接到多个事件源,这就是 Action 接口。
有一个类实现了这个接口除 actionPerformed 方法之外的所有方 法,它就是 AbstractAction。这个类存储了所有名 / 值对, 并管理着属性变更监听器。我们可 以直接扩展 AbstractAction 类,并在扩展类中实现 actionPerformed方法。
五、AWT事件继承层次
AWT事件类的继承关系图
事件处理总结:
AWT将事件分为底层low-level)事件和语义semantic)事件。语义事件是表示用户动作的事件,底层事件是形成那些事件的事件。
下面是 java.awt.event 包中最常用的语义事件类:
•ActionEvent (对应按钮点击、 菜单选择、选择列表项或在文本框中 ENTER);
•AdjustmentEvent (用户调节滚动条);
•ItemEvem (用户从复选框或列表框中选择一项)。
常用的 5 个底层事件类是:
•KeyEvent (一个键被按下或释放);
•MouseEvent (鼠标键被按下、 释放、 移动或拖动);
•MouseWheelEvent (鼠标滚轮被转动);
•FocusEvent (某个组件获得焦点或失去焦点);
•WindowEvent ( 窗口状态被改变)
所有的Listener接口都继承于EventListener,位于java.util包中。
接口 | 方法 | 参数 / 访问方法 | 事件源 | 描述信息 |
ActionListener | actionPerformed | ActionEvent • getActionCommand • getModifiers | AbstractButton JComboBox JTextField Timer | 单击按钮、单击菜单项 文本框内按回车等动作 |
AdjustmentListener | adjustmentValueChanged | AdjustmentEvent •getAdjustable •getAdjustmentType •getValue | JScrollbar | 移动了滚动条等组件 |
ItemListener | itemStateChanged | ItemEvent •getltem •getltemSelectable •getStateChange | AbstractButton JComboBox | 选择了可选项的内容 |
FocusListener | focusGained focusLost | FocusEvent •isTemporary | Component | 组件得到或失去焦点 |
KeyListener | keyPressed keyReleased keyTyped | KeyEvent •getKeyChar •getKeyCode •getKeyModifiersText •getKeyText •isActionKey | Component | 键盘输入 |
MouseListener | mousePressed mouseReleased mouseEntered mouseExited mouseClicked | MouseEvent •getClickCount •getX •getY •getPoint •translatePoint | Component | 鼠标点击等 |
MouseMotionListener | mouseDragged mouseMoved | MouseEvent | Component | 鼠标移动 |
MouseWheelListener | mouseWheelMoved | MouseWheelEvent •getWheelRotation •getScrollAmount | Component | 鼠标滚轮被转动 |
WindowListener | windowClosing windowOpened windowlconified windowDeiconified windowClosed windowActivated windowDeactivated | WindowEvent •getWindow | Window | 窗口事件 |
WindowFocusListener | windowGainedFocus windowLostFocus | WindowEvent •getOppositeWindow | Window | 窗体得到或失去焦点 |
WindowStateListener | windowStateChanged | WindowEvent •getOldState •getNewState | Window | 窗体状态 |