概述
定义
当在某个组件上反生某些操作的时候,会自动的触发一些代码的执行
相关名词
- 事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮、窗口等
- 事件(Event):该事件源上发生的操作可以叫做事件,如点击,滑动等,GUI会把事件封装到一个Event对象中,如果需要该事件的详细信息,就可以通过Event对象来获取
- 事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理
- 注册监听:把事件监听器通过某个事件绑定到某个事件源上,当该事件源发生了该事件,那么监听器的代码会自动执行
处理机制流程图
基本使用步骤
- 创建事件源组件对象
- 自定义类,实现XxxListener接口,重写方法
- 创建事件监听器对象(自定义类对象)
- 调用事件源组件对象的addXxxListener方法来完成注册监听
代码演示
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class EventDemo1 {
/*窗口*/
Frame frame = new Frame("这里测试事件监听机制");
/*组件*/
//按钮
Button ok = new Button("确定");
//文本域
TextArea text = new TextArea();
/*监听器*/
//按钮
private void createListener() {
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
text.setText("Hello World");
}
});
//窗口关闭
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/*组装与初始化*/
private void init() {
createListener();
frame.add(text);
frame.add(ok,BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new EventDemo1().init();
}
}
运行结果
GUI中常见事件和事件监听器
事件监听器必须实现事件监听器接口,AWT提供了大量的事件监听器接口用于实现不同类型的事件监听器,用于监听不同类型的事件。AWT中提供了丰富的事件类,用于封装不同组件上所发生的特定操作,AWT的事件类都是AWTEvent的子类,AWTEvent是EventObject的子类。
低级事件
这类事件是基于某个特定的动作的事件。比如进入、点击、拖放等动作的鼠标事件,再比如得到焦点和失去焦点的焦点事件
事件 | 触发时机 |
---|---|
ComponentEvent | 组件事件,当组件尺寸发生变化、位置发生移动、显示/隐藏状态发生改变时触发该事件 |
ContainerEvent | 容器事件,当容器里发生添加组件,删除组件时触发该事件 |
WindowEvent | 窗口事件,当窗口状态发生变化(如打开、关闭、最大化、最小化时触发该事件) |
FocusEvent | 焦点事件,当组件得到焦点或失去焦点时触发该事件 |
KeyEvent | 键盘事件,当键盘按下、松开、单击时触发该事件 |
MouseEvent | 鼠标事件,当进行单击、按下、松开、移动鼠标等动作时触发该事件 |
PaintEvent | 组件绘制事件,该事件是一个特殊的事件类型,当GUI组件调用update/paint方法来呈现自身时触发该事件,该事件并非专用于事件处理模型 |
高级事件
这类事件并不会基于某个特定动作,而是根据功能含义定义的动作
事件 | 触发时机 |
---|---|
ActionEvent | 动作事件,当按钮、菜单项被单击,在TextField中按Enter键时触发 |
AjustmentEvent | 调节事件,在滑动条上移动滑块数值时触发该事件 |
ItemEvent | 选项事件,当用户选中某项,或取消选中某项时触发该事件 |
TextEvent | 文本事件,当文本框,文本域中的文本发生改变时触发该事件 |
事件监听器
不同的事件需要使用不同的监听器监听,不同的监听器需要实现不同的监听器接口,当指定事件发生后,事件监听器就会调用所包含的事件处理器(实例方法)来处理事件。
事件类别 | 描述信息 | 监听器接口名 |
---|---|---|
ActionEvent | 激活组件 | ActionListener |
ItemEvent | 选择了某些项目 | ItemListener |
MouseEvent | 鼠标移动 | MouseMotionListener |
MouseEvent | 鼠标点击 | MouseListener |
KeyEvent | 键盘输入 | KeyListener |
FocusEvent | 组件收到了或者失去了焦点 | FocusListener |
AdjustmentEvent | 移动了滚动条组件 | AdjustmentListener |
ComponentEvent | 对象移动缩放显示隐藏等 | ComponentListener |
WindowEvent | 窗口收到窗口级事件 | WindowListener |
ContainerEvent | 容器中增加删除了组件 | ContainerListener |
TextEvent | 文本字段或文本区发生改变 | TextListener |
代码演示
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.awt.event.ItemListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class EventDemo2 {
Frame frame = new Frame("这里测试监听器");
/*组件*/
//下拉选择框
Choice choice = new Choice();
//文本框
TextField text = new TextField(50);
/*监听*/
private void createListener() {
//选择框
ItemListener itemListener = e->{
Object now = e.getItem();
System.out.println("当前选择的条目为:"+now);
};
choice.addItemListener(itemListener);
//文本框
text.addTextListener(new TextListener() {
@Override
public void textValueChanged(TextEvent e) {
System.out.println("当前文本框中的内容为:"+text.getText());
}
});
//窗口
frame.addContainerListener(new ContainerAdapter() {
@Override
public void componentAdded(ContainerEvent e) {
System.out.println("frame中增加了:"+e.getChild());
}
});
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/*组装与初始化*/
private void init() {
//监听器初始化
createListener();
//下拉选择框初始化
choice.add("张三");
choice.add("李四");
choice.add("王五");
frame.setLayout(new FlowLayout(FlowLayout.LEFT));
frame.add(choice);
frame.add(text);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new EventDemo2().init();
}
}
运行结果