Java AWT事件处理
1 AWT事件处理基本概念
AWT事件处理的过程中,主要涉及3类对象。
(1) Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent。其实例在改事件发生时有系统自动产生。
(2) Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮Button。
(3) Event Monitor(事件监听器):接收事件对象并对其进行处理的类的对象,通常其中某个成员方法对事件进行相应的处理。
事件委托处理模型
图10-10 事件委托处理模型
Java采取了事件委托处理模型(Delegation Model),事件源自己不处理事件,而是把在其自身所有可能发生的事件委托给事件监听器来处理。比如,在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以委托给事件监听器1来处理鼠标事件,同时委托给事件监听器2来处理键盘事件。委托模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。
2 事件
事件分类。
按事件的性质分类
java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件。
(1)低级事件
低级事件是指基于组件和容器的事件,当一个组件上发生事件,如鼠标的进入、点击、拖放等,或组件的窗口开关等时,触发了组件事件。
— ComponentEvent(组件事件:组件尺寸的变化、移动);
— ContainerEvent(容器事件:组件增加、移动);
— WindowEvent(窗口事件:关闭窗口、窗口闭合、图标化);
— FocusEvent(焦点事件:焦点的获得和丢失);
— KeyEvent(键盘事件:键按下、释放);
— MouseEvent(鼠标事件:鼠标单击、移动)。
(2)高级事件(语义事件)
高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类。比如,在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,选中项目列表的某一条就会触发ItemEvent事件。
— ActionEvent(动作事件:按钮按下,TextField中按Enter键);
— AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值);
— ItemEvent(项目事件:选择项目,不选择“项目改变”);
— TextEvent(文本事件:文本对象改变)。
3 事件监听器
3.1.事件监听器基本概念
事件监听器通常是一个类,该类必须实现与该事件类型相对应的接口。对应的接口被称为事件监听器接口。事件监听器接口类的名称与事件类的名称相对应,例如,MouseEvent事件类的监听器接口名为MouseListener。
每类事件都有监听器是接口,根据动作来定义方法。例如,与键盘事件KeyEvent相对应的接口是:
public interface KeyListener extends EventListener
{
public void keyPressed(KeyEvent ev);
public void keyReleased(KeyEvent ev);
public void keyTyped(KeyEvent ev);
}
注意到在本接口中有3个方法,那么Java运行时系统什么时候调用哪个方法呢?其实根据这3个方法的方法名就能够知道应该是什么时候调用哪个方法执行了。当键盘键刚按下去时,将调用ke yPressed()方法执行;当键盘键抬起来时,将调用keyReleased()方法执行;当键盘键敲击一次时,将调用keyTyped()方法执行。
又例如,窗口事件接口:
public interface WindowListener extends EventListener
{
public void windowClosing(WindowEvent e);
public void windowOpened(WindowEvent e);
public void windowIconified(WindowEvent e);
public void windowDeiconified(WindowEvent e);
public void windowClosed(WindowEvent e);
public void windowActivated(WindowEvent e);
public void windowDeactivated(WindowEvent e);
}
AWT的组件类中提供注册和注销监听器的方法。
(1)注册监听器
public void addXXXListener( );
(2)注销监听器
public void remove XXXListener( );
处理发生在某个GUI组件上的XxxEvent事件的某种情况,其事件处理的通用编写流程如下:(1)编写一个实现了XxxListener接口的事件监听器类;
(2)在XxxListener类中用于处理该事件情况的方法中,编写处理代码;
(3)调用组件的addXxxListener方法,将类XxxListener创建的实例对象注册到GUI组件上。
(1)可以声明多个接口,接口之间用逗号隔开。
…implements MouseMotionListener, MouseListener, WindowListener;
(2)可以由同一个对象监听一个事件源上发生的多种事件:
f.addMouseMotionListener(this);
f.addMouseListener(this);
f.addWindowListener(this);
则对象f上发生的多个事件都将被同一个监听器接收和处理。
(3)事件监听器和事件源处在同一个类中。本例中事件源是Frame f,事件监听器是类ThreeL istener,其中事件源Frame f是类ThreeListener的成员变量。
(4)可以通过事件对象获得详细资料,比如,本例中就通过事件对象获得了鼠标发生时的坐标值。
public void mouseDragged(MouseEvent e)
{
String s="Mouse dragging :X="+e.getX()+"Y="+e.getY();
tf.setText(s);
}
根据实现事件接口的方式不同可有如下4种方法:
●内部类做监听器
●匿名内部类做监听器
●本类做监听器
●其它类做监听器
例1;
/* 1. inner class
import java.awt.*;
import java.awt.event.*;
class MyEvent extends Frame
{
TextField t1,t2,t3;
Button b1;
Label c,m;
MyEvent()
{
t1=new TextField("100",10);
t2=new TextField("200",10);
t3=new TextField(10);
b1=new Button("计算");
c=new Label("=");
m=new Label("+");
add(t1);
add(m);
add(t2);
add(c);
add(t3);
add(b1);
b1.addActionListener(new M());
setLayout(new FlowLayout());
setBounds(100,100,360,200);
setVisible(true);
}
class M implements ActionListener
{
public void actionPerformed(ActionEvent e) {
int a=Integer.parseInt(t1.getText());
int b=Integer.parseInt(t2.getText());
int c=a+b;
t3.setText(String.valueOf(c));
}
}
public static void main(String[] args) {
new MyEvent();
}
}
*/
/* 2. nameless inner class
import java.awt.*;
import java.awt.event.*;
class MyEvent extends Frame
{
TextField t1,t2,t3;
Button b1;
Label c,m;
MyEvent()
{
t1=new TextField("100",10);
t2=new TextField("200",10);
t3=new TextField(10);
b1=new Button("计算");
c=new Label("=");
m=new Label("+");
add(t1);
add(m);
add(t2);
add(c);
add(t3);
add(b1);
b1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int a=Integer.parseInt(t1.getText());
int b=Integer.parseInt(t2.getText());
int c=a+b;
t3.setText(String.valueOf(c));
}
});
setLayout(new FlowLayout());
setBounds(100,100,360,200);
setVisible(true);
}
public static void main(String[] args)
{
new MyEvent();
}
}
*/
/* 3. this class
import java.awt.*;
import java.awt.event.*;
class MyEvent extends Frame implements ActionListener {
TextField t1,t2,t3;
Button b1;
Label c,m;
MyEvent()
{
t1=new TextField("100",10);
t2=new TextField("200",10);
t3=new TextField(10);
b1=new Button("计算");
c=new Label("=");
m=new Label("+");
add(t1);
add(m);
add(t2);
add(c);
add(t3);
add(b1);
b1.addActionListener(this);
setLayout(new FlowLayout());
setBounds(100,100,360,200);
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
int a=Integer.parseInt(t1.getText());
int b=Integer.parseInt(t2.getText());
int c=a+b;
t3.setText(String.valueOf(c));
}
public static void main(String[] args) {
new MyEvent();
}
}
*/
/* ohter class 1
import java.awt.*;
import java.awt.event.*;
class MyEvent extends Frame
{
TextField t1,t2,t3;
Button b1;
Label c,m;
MyEvent()
{
t1=new TextField("100",10);
t2=new TextField("200",10);
t3=new TextField(10);
b1=new Button("计算");
c=new Label("=");
m=new Label("+");
add(t1);
add(m);
add(t2);
add(c);
add(t3);
add(b1);
b1.addActionListener(new M(this));
setLayout(new FlowLayout());
setBounds(100,100,360,200);
setVisible(true);
}
public static void main(String[] args)
{
new MyEvent();
}
}
class M implements ActionListener
{
MyEvent f1;
M(MyEvent f)
{
f1=f;
}
public void actionPerformed(ActionEvent e) {
int a=Integer.parseInt(f1.t1.getText());
int b=Integer.parseInt(f1.t2.getText());
int c=a+b;
f1.t3.setText(String.valueOf(c)); }
}
*/
// ohter class 2
import java.awt.*;
import java.awt.event.*;
class MyEvent extends Frame
{
TextField t1,t2,t3;
Button b1;
Label c,m;
MyEvent()
{
t1=new TextField("100",10);
t2=new TextField("200",10);
t3=new TextField(10);
b1=new Button("计算");
c=new Label("=");
m=new Label("+");
add(t1);
add(m);
add(t2);
add(c);
add(t3);
add(b1);
b1.addActionListener(new M(this));
setLayout(new FlowLayout());
setBounds(100,100,360,200);
setVisible(true);
}
void cc()
{
int a=Integer.parseInt(t1.getText());
int b=Integer.parseInt(t2.getText());
int c=a+b;
t3.setText(String.valueOf(c));
}
public static void main(String[] args)
{
new MyEvent();
}
}
class M implements ActionListener
{
MyEvent f1;
M(MyEvent f)
{
f1=f;
}
public void actionPerformed(ActionEvent e) {
https://www.doczj.com/doc/d81734471.html,();
}
}
例2;
/* inner class
import java.awt.*;
import java.awt.event.*;
class MyEvent
{
Frame f;
Label c;
void myint()
{
f=new Frame();
c=new Label("鼠标单击点的坐标:");
f.add(c);
c.setBounds(20,50,300,20);
f.setLayout(null);
f.addMouseListener(new M());
f.setBounds(100,100,350,200);
f.setVisible(true);
f.setFont(new Font("Arial",0,16));
AWT事件处理模型
事件类别描述信息接口名方法ActionEvent 激活组件ActionListener actionPerformed(ActionEvent) ItemEvent 选择了某些项目ItemListener itemStateChanged(ItemEvent) MouseEvent 鼠标移动 MouseMotionListener mouseDragged(MouseEvent) mouseMoved(MouseEvent) 鼠标点击等MouseListener mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent) KeyEvent 键盘输入KeyListener keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) FocusEvent 组件收到或失去焦 点 FocusListener focusGained(FocusEvent) focusLost(FocusEvent) AdjustmentEvent 移动了滚动条等组 件AdjustmentListener adjustmentValueChanged(AdjustmentEvent) ComponentEvent 对象移动缩放显示 隐藏等ComponentListener componentMoved(ComponentEvent) componentHidden(ComponentEvent) componentResized(ComponentEvent) componentShown(ComponentEvent) WindowEvent 窗口收到窗口级事 件 WindowListener windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) ContainerEvent 容器中增加删除了 组件ContainerListener componentAdded(ContainerEvent) componentRemoved(ContainerEvent) TextEvent 文本字段或文本区TextListener textValueChanged(TextEvent)
第八讲AWT和事件监听打印本页 1 基本概念 下面几讲,我们就来学习AWT的各种容器和组件,并重点学习AWT的事件监听和处理方法。由于学习事件需要用到一些简单的构件,我们先学习几个简单的构件。现在,我们先来介绍AWT里面几个重要的概念:构件,容器,布局管理器和事件监听(AWT P4)。 1.1构件是图形用户界面的最小单位之一,它里面不再包含其他的成分. 构件的作用是完成与用户的一次交互,包括接受用户的一个命令,接受用户的一个文本输入,向用户显示一段文本或一个图形等。常用的构件有: 按钮构件 项目选择构件:复选框(Checkbox)列表(List或Choice) 文本构件:文本框文本区 对话框构件:对话框文件对话框提示框帮助 菜单构件:弹出式菜单复选框菜单 1.2容器 容器是用来组织构件的单元。常用的容器有:面板、窗口。 1.3布局管理器: 布局管理器用来布置容器和容器中的各个构件,比如他们的大小、位置等。AWT提供了几种标准的布局管理器。 1.4事件监听 要使点击鼠标、敲打键盘等实现特定的动作,我们需要捕捉事件并且加以实现。AWT里典型的事件有:鼠标事件、鼠标移动事件、键盘事件、窗口事件等。 我们通过学习最基本的构件和容器(标签、按钮和面板)来粗略理解这些概念。标签和按钮是显示标签的简单构件;而面板是AWT提供的最基本的容器。 2 几个简单的构件和容器 标签(https://www.doczj.com/doc/d81734471.html,bel) 标签用来显示文本。 演示(StarterApplet) 面板(java.awt.Panel) 面板是一个通用的容器,在上面可以放置各种构件。 我们经常用的Applet类,其实就是面板的一个子类 按钮(java.awt.Button) 按钮具有三维外型,当它们被激活时触发按钮事件,用户可以根据按钮事件,做出适当的反应,比如执行一系列操作等。 演示 3 事件 AWT有两种事件处理模型:一种是基于继承的模型,它在AWT1.1或以前的版本中使用,现在已经逐渐被淘汰;另一种是基于授权的事件模型。我们主要学习给予授权的事件模型。 授权事件模型的原理很简单:事件源激发事件、事件监听器监听事件,最后执行事件。可以通过调用addXYZListener(XYZListner)方法向构件注册监听器。把监听器加到构件中以后,如果构件激发相应类型的事件,
Java AWT事件处理 1 AWT事件处理基本概念 AWT事件处理的过程中,主要涉及3类对象。 (1) Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent。其实例在改事件发生时有系统自动产生。 (2) Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮Button。 (3) Event Monitor(事件监听器):接收事件对象并对其进行处理的类的对象,通常其中某个成员方法对事件进行相应的处理。 事件委托处理模型 图10-10 事件委托处理模型 Java采取了事件委托处理模型(Delegation Model),事件源自己不处理事件,而是把在其自身所有可能发生的事件委托给事件监听器来处理。比如,在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以委托给事件监听器1来处理鼠标事件,同时委托给事件监听器2来处理键盘事件。委托模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。 2 事件
事件分类。 按事件的性质分类 java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件。 (1)低级事件 低级事件是指基于组件和容器的事件,当一个组件上发生事件,如鼠标的进入、点击、拖放等,或组件的窗口开关等时,触发了组件事件。 —ComponentEvent(组件事件:组件尺寸的变化、移动); —ContainerEvent(容器事件:组件增加、移动); —WindowEvent(窗口事件:关闭窗口、窗口闭合、图标化); —FocusEvent(焦点事件:焦点的获得和丢失); —KeyEvent(键盘事件:键按下、释放); —MouseEvent(鼠标事件:鼠标单击、移动)。 (2)高级事件(语义事件) 高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类。比如,在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,选中项目列表的某一条就会触发ItemEvent事件。 —ActionEvent(动作事件:按钮按下,TextField中按Enter键); —AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值); —ItemEvent(项目事件:选择项目,不选择“项目改变”); —TextEvent(文本事件:文本对象改变)。
5.2.1 事件类 与AWT有关的所有事件类都由java.awt.AWTEvent类派生,它也是EventObject类的子类。AWT事件共有10类,可以归为两大类:低级事件和高级事件。 java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件,低级事件是指基于组件和容器的事件,当一个组件上发生事件,如:鼠标的进入,点击,拖放等,或组件的窗口开关等,触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。 ◇低级事件 ComponentEvent(组件事件:组件尺寸的变化,移动) ContainerEvent(容器事件:组件增加,移动) WindowEvent(窗口事件:关闭窗口,窗口闭合,图标化) FocusEvent(焦点事件:焦点的获得和丢失) KeyEvent(键盘事件:键按下、释放) MouseEvent(鼠标事件:鼠标单击,移动) ◇高级事件(语义事件) ActionEvent(动作事件:按钮按下,TextField中按Enter键) AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值) ItemEvent(项目事件:选择项目,不选择"项目改变") TextEvent(文本事件,文本对象改变) 5.2.2 事件监听器 每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。 例如,与键盘事件KeyEvent相对应的接口是: public interface KeyListener extends EventListener { public void keyPressed(KeyEvent ev); public void keyReleased(KeyEvent ev); public void keyTyped(KeyEvent ev); } 注意到在本接口中有三个方法,那么java运行时系统何时调用哪个方法?其实根据这三个方法的方法名就能够知道应该是什么时候调用哪个方法执行了。当键盘刚按下去时,将调用keyPressed( )方法执行,当键盘抬起来时,将调用keyReleased( )方法执行,当键盘敲击一次时,将调用keyTyped( )方法执行。