JavaGUI图形化界面编程(四)—事件处理机制

概述

定义

当在某个组件上反生某些操作的时候,会自动的触发一些代码的执行

相关名词

  1. 事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮、窗口等
  2. 事件(Event)该事件源上发生的操作可以叫做事件,如点击,滑动等,GUI会把事件封装到一个Event对象中,如果需要该事件的详细信息,就可以通过Event对象来获取
  3. 事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理
  4. 注册监听把事件监听器通过某个事件绑定到某个事件源上,当该事件源发生了该事件,那么监听器的代码会自动执行

处理机制流程图

在这里插入图片描述

基本使用步骤

  1. 创建事件源组件对象
  2. 自定义类,实现XxxListener接口,重写方法
  3. 创建事件监听器对象(自定义类对象)
  4. 调用事件源组件对象的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();

	}

}

运行结果
在这里插入图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值