AWT事件处理

GUI-AWT事件处理

引入事件处理机制,说白了就是对用户的行为作出反应。

在前面,创建了Frame窗口后,单击 X 却无法关闭。

因为在AWT中,所有的事件必须由特定对象(事件监听器)来处理,Frame和组件本身只是个框架,没办法响应。

载入库

import java.awt.event.*;

事件处理过程中,就是3个对象。

Event——事件,封装了GUI组件上发生的特定的事件(通常是用户的一次操作)

Event Source——事件发生源,通常是各个组件,如窗口、按钮

Event Listener——负责监听事件发生源所发生的的事件并给出回应


这三个的处理流程

外部动作——触发事件——明确事件源——生成事件对象——将此事件传入——事件监听器——调用事件处理器来响应。

事件监听器——将事件监听器注册到事件源

例如:如何进行关闭

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

//创建Frame对象 窗口
	Frame f = new Frame("Frame窗口");
	f.setSize(300,200);
	f.setVisible(true);
//new一个ListenerClose lc
	ListenerClose lc = new ListenerClose();
//在窗口上添加上这个lc
	f.addWindowListener(lc);		
}}


//用ListenerClose接上WindowListener
class ListenerClose implements WindowListener{

//实现接口内置方法(重写):windowClosing()实现关闭窗口。
	public void windowClosing(WindowEvent e){
	//得到这个窗口e
		Window w = e.getWindow();
	//窗口设置为不可见并释放 = 关闭窗口
		w.setVisible(false);
		w.dispose(); 

	}
	//因为是继承接口,剩下的也都要实现
	public void windowOpened(WindowEvent e){}
	public void windowClosed(WindowEvent e){}
	public void windowIconified(WindowEvent e){}
	public void windowDeiconified(WindowEvent e){}
	public void windowActivated(WindowEvent e){}
	public void windowDeactivated(WindowEvent e){}
}

弊端

因为使用了接口,需要实现七个方法

事件适配器

本来只想要执行一件事,最后却要多写7个方法,咱肯定不乐意啊。

毕竟,洒家只想要重写windowClosing()一个方法,只想做关闭窗口这一件事。

原理:

事件适配器,事件适配器是监听器接口的空实现,即事件适配器实现了监听器接口,并为接口里面的每个方法都提供了实现,但是方法体内没有任何代码,这是一种空实现。这下好了,你尽管去写,其他的方法我都给你安排好了,虽然里面是空的,但好歹写完可以实现了。

所有包含的多个方法的监听器接口都有一个对应的适配器。

以下。

Listener ----> Adapter

监听器接口:

ContainerListener
FocusListener
ComponentListener
KeyListener
MouseListener
MouseMotionListener
WindowListener

换成适配器,就把Listener ----> Adapter

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

	//创建Frame对象,new一个窗口
	Frame f = new Frame("Frame窗口");
	f.setSize(300,200);
	f.setVisible(true);
	
	ListenerClose lc = new ListenerClose();
	f.addWindowListener(lc);
	
	
}
}

//用ListenerClose继承WindowAdapter,重写windowClosing()
class ListenerClose extends WindowAdapter{
	public void windowClosing(WindowEvent e){
		Window w = e.getWindow();
		w.setVisible(false);
		w.dispose();
	}
}

匿名内部类实现事件处理

现在,已经用了事件适配器,是比较简洁了。

但是,除了主方法,还是需需要创建一个多的类,能再简洁一些吗?

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

	//创建Frame对象,new一个窗口
	Frame f = new Frame("Frame窗口");
	f.setSize(300,200);
	f.setLocation(800,400);//设定相对于屏幕的位置
	f.setVisible(true);、
	
	//直接在参数里面写匿名类
	f.addWindowListener(new WindowAdapter(){
		public void windowClosing(WindowEvent e){
			Window w = e.getWindow();
			w.setVisible(false);
			w.dispose();
		}
	});	
}}

常用事件分类

例如之前的:

窗口事件、鼠标、键盘、动作

窗口事件WindowListener接口的方法

关于一个窗口的所有变化,如打开、关闭

void windowIconified(WindowEvent e)			//窗口最小化时触发   
void windowDeactivated(WindowEvent e)    	//取消窗口选中时触发    
void windowDeiconified(WindowEvent e)       //窗口从最小化中恢复时触发   
void windowActivated(WindowEvent e)         //窗口选中时触发
  
void windowOpened(WindowEvent e)			//打开窗口触发 
void windowClosed(WindowEvent e)			//关闭窗口触发    
void windowClosing(WindowEvent e)			//窗口正在关闭时触发     

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

	//创建Frame对象
	Frame f = new Frame("Frame窗口");
	f.setSize(300,200);
	f.setLocation(800,400);//设定相对于屏幕的位置
	f.setVisible(true);
	
//new WindowAdapter()作匿名类传入
	f.addWindowListener(new WindowAdapter(){
		public void windowOpened(WindowEvent e){
			System.out.println("windowOpened -->窗口被打开");
		}
		public void windowIconified(WindowEvent e){
			System.out.println("windowIconified -->窗口最小化");
		}
		public void windowDeiconified(WindowEvent e){
			System.out.println("windowDeiconified --> 窗口从最小化中恢复");
		}
		public void windowDeactivated(WindowEvent e){
			System.out.println("windowDeactivated --> 取消窗口选中 ");
		}
		public void windowClosing(WindowEvent e){
			System.out.println("windowClosing -->窗口正在关闭");
		}
		public void windowClosed(WindowEvent e){
			System.out.println("windowClosed -->窗口关闭");
		}
		public void windowActivated(WindowEvent e){
			System.out.println("windowActivated -->窗口被选中");
		}
	});
		
}}
windowIconified -->窗口最小化     
windowDeactivated --> 取消窗口选中 
windowDeiconified -->     窗口从最小化中恢复
windowActivated -->窗口被选中     
windowIconified -->窗口最小化     
windowDeactivated --> 取消窗口选中 
windowDeiconified -->     窗口从最小化中恢复
windowActivated -->窗口被选中     
windowClosing -->窗口正在关闭     
windowClosing -->窗口正在关闭     
windowClosing -->窗口正在关闭     
windowDeactivated --> 取消窗口选中 

鼠标事件 MouseEvent

void mouseClicked(MouseEvent e)					//单击(按下又松开)
void mousepressed(MouseEvent e)					//按下
void mouseReleased(MouseEvent e)				//松开

void mouseEnteren(MouseEvent e)					//进入
void mouseExited(MouseEvent e)					//退出
鼠标与按钮
package test1;
import java.awt.*;
import java.awt.event.*;

class DrawFrame extends Panel{
	public void paint(Graphics g){
		g.drawArc(10,10,30,30,300,180);
		g.drawLine(50,10,70,40);
		g.drawRect(10,50,30,30);
		g.drawRoundRect(50,50,30,30,20,20);
	}
}

public class Class1 {
public static void  main(String[] args){
	
	Frame f = new Frame("Frame窗口");
	Panel p = new Panel();
	Button b = new Button("按钮");
	p.add(b);
	f.add(p);
	f.setSize(300,200);
	f.setLocation(500,200);
	f.setVisible(true);



b.addMouseListener(new MouseListener(){
	public void mouseReleased(MouseEvent e){
		System.out.println("mouseReleased --> 鼠标松开");
	}
	public void mousePressed(MouseEvent e){
		System.out.println("mousePressed --> 鼠标按下");
	}
	public void mouseExited(MouseEvent e){
		System.out.println("mouseExited --> 鼠标离开");
	}
	public void mouseEntered(MouseEvent e){
		System.out.println("mouseEntered --> 鼠标进入");
	}
	
	public void mouseClicked(MouseEvent e){
		int i = e.getButton();
		if( i== MouseEvent.BUTTON1){
			System.out.println("mouseClicked --> 鼠标左键点击" + e.getClickCount() + "次");
		}else if( i== MouseEvent.BUTTON3){
			System.out.println("mouseClicked --> 鼠标右键点击" + e.getClickCount() + "次");
		}else{
			System.out.println("mouseClicked --> 按下滚轴" + e.getClickCount() + "次");
		}
	}	
});

}}

键盘事件

KeyListener

void KeyTyped(KeyEvent e)		敲击某键时调用
void KeyPressed(KeyEvent e)		按下时调用
void KeyReleased(KeyEvent e)	送开就调用
char getKeyChar()		返回输入的字符,只对KeyTyped()有反应
int getKeyCode()		返回输入字符的键码
static String getKeyText(int KeyCode) 返回此键的信息,例如F1、H

package test1;
import java.awt.*;
import java.awt.event.*;



public class Class1 {
public static void  main(String[] args){
	
	Frame f = new Frame("Frame窗口");
	Panel p = new Panel();

	TextField tf = new TextField(10);	//创建文本框
	p.add(tf);
	f.add(p);
	f.setSize(300,200);
	f.setLocation(500,200);
	f.setVisible(true);



	tf.addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent e){
			System.out.println("keyPressed --> 键盘" + KeyEvent.getKeyText(e.getKeyCode()) + "键按下");
		}
		public void keyReleased(KeyEvent e){
			System.out.println("keyReleased --> 键盘" + KeyEvent.getKeyText(e.getKeyCode()) + "键松开");
		}
		public void keyTyped(KeyEvent e){
			System.out.println("keyTyped --> 键盘输入的内容是:" + e.getKeyChar());
		}
	});

}}

keyReleased --> 键盘A键松开
keyTyped --> 键盘输入的内容是:a
keyReleased --> 键盘Shift键松开
keyPressed --> 键盘Shift键按下
keyPressed --> 键盘A键按下
keyTyped --> 键盘输入的内容是:A
keyReleased --> 键盘A键松开
keyReleased --> 键盘Shift键松开

动作事件

如果要让一个按钮变得有意义,就需要使用动作事件。

在AWT的事件处理中,动作事件与前三件事件不同,它不代表某个具体的动作,只代表一个动作发生了,。

例如要赋值一段话,通过鼠标右键能赋值,通过键盘的Ctrl+C也能赋值,但是我们不需要知道是用哪种方式赋值的,只要是进行复制操作了,就触发了这个动作事件。

Java的ActionListener是专门处理动作的事件监听接口。
# 下一节接:布局管理器

posted @ 2021-11-25 16:10  Dinesaw  阅读(232)  评论(0编辑  收藏  举报