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是专门处理动作的事件监听接口。
# 下一节接:布局管理器