AWT事件处理模型
在事件处理的过程中,主要涉及以下三类对象:
Event:事件,用户对界面操作在Java语言上的描述,以类的形式出现
Event Source:事件源,事件发生的场所,通常就是各种组件
Event Handler:事件处理者,接受事件对象并对其进行处理的对象
举个例子:TestButton.java
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestButton {
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f = new Frame("Test");
Button b = new Button("Press Me!");
b.addActionListener(new ButtonHandler()); //该方法的参数是事件处理者,要处理的是ActionEvent事件
f.setLayout(new FlowLayout());
f.setSize(200,200);
f.add(b);
f.setVisible(true);
}
}
class ButtonHandler implements ActionListener{ //实现接口ActionListener才能充当事件ActionEvent的处理者
public void actionPerformed(ActionEvent e) { //系统产生的ActionEvent事件对象被当前做参数传递给该方法
System.out.println("Action occurred");
}
}
执行后,单击按钮就会在命令行中输出“Action occurred”
在钙离子中,事件源就是按钮,事件是ActionEvent对象,事件处理者是ButtonHandler对象,事件发生后,java的运行系统会自动调用ButtonHandler对象的actionPerformed()方法进行处理,而且事件ActionEvent对象将被当作参数传递给actionPerformed()方法;
事件类
1.java.lang.Object
java。util。EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。
2.java.awt.AWTEvent
与AWT有关的所有事件类都由java.awt.AWTEvent类派生,这些AWT事件被分为低级事件和高级事件两大类;低级时间是指基于组件和容器的事件,如鼠标的点击、进入等都是低级事件,高级事件可以不和特定的动作相关联,而依赖于触发此事件的类;
低级事件:ComponentEvent(组件事件:组件尺寸的变化,移动)
ContainerEvent(容器事件:组件的增加,移动)
WindowEven(窗口事件:关闭窗口,图标化)
高级事件:ActionEvent(动作事件:按钮按下,TextField中按Enter键)
TextEvent(文本事件:文本对象改变)
事件适配器
Java语言为为一些Listener接口提供了适配器(Adapter)类。
java.awt.event包中定义的事件适配器:
ComponentAdapter(组件适配器)
ContainerAdapter(容器适配器)
FocusAdapter(焦点适配器)
KeyAdapter(键盘适配器)
用内部类实现事件处理
内部类是被定义于另一个类中的类。
编写事件驱动程序,内部类很方便
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestInnerClass {
private Frame f;
private TextField tf;
public void launchFrame() {
f = new Frame("Inner");
tf = new TextField(30);
Label label = new Label("Click and drag the mouse");
f.add(label, BorderLayout.NORTH);
f.add(tf,BorderLayout.SOUTH);
f.addMouseMotionListener(new MyMouseMotionListener()); //参数为内部类
f.addWindowListener(new MyWindowListener());
f.setSize(200,200);
f.setVisible(true);
}
class MyMouseMotionListener extends MouseMotionAdapter { //内部类的开始
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
String s = "Mouse dragging: x = "+e.getX()+"y = "+e.getY();
tf.setText(s);
} //内部类结束
}
class MyWindowListener extends WindowAdapter{ //内部类的开始
public void windowClosing(WindowEvent e) {
System.exit(1);
}
} //内部类结束
public static void main(String[] args) {
// TODO Auto-generated method stub
TestInnerClass tic = new TestInnerClass();
tic.launchFrame();
}
}
匿名类
所谓匿名,就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class AnonymousClass {
private Frame f;
private TextField tf;
public AnonymousClass() {
f = new Frame("Inner");
tf = new TextField(30);
}
public void launchFrame() {
Label label = new Label("Click and drag the mouse");
f.add(label, BorderLayout.NORTH);
f.add(tf,BorderLayout.SOUTH);
f.addMouseMotionListener(new MouseMotionAdapter() { //匿名类开始
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
String s = "Mouse dragging: x = "+e.getX()+"y = "+e.getY();
tf.setText(s);
}
}); //匿名类结束
f.addWindowListener(new WindowAdapter() { //匿名类开始
public void windowClosing(WindowEvent e) {
System.exit(1);
}
}); //匿名类结束
f.setSize(200,200);
f.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
AnonymousClass obj = new AnonymousClass();
obj.launchFrame();
}
}
两个例子实现的功能都是完全一样的,只不过采取的方式不同;