事件适配器
Java 语言 为一些Listener 接口提供了适配器类(Adapter)。可以通过继承事件所对应的Adapter 类,重写需要的方法,对不相关的事件不用实现。事件适配器提供了一种简单的实现监听器的手段,可以缩短程序代码。但是,由于java的单一继承机制,当需要多种监听器或者此类已有父类时,就无法采用事件适配器了。
如下列采用了鼠标适配器
import java.awt.*;
import java.awt.event.*;
public class MouseClickHandler extends MouseAdaper{
public void mouseClicked(MouseEvent e){..................}
}
java.awt.event包中定义的事件适配器类包括以下几个
ComponentAdapter 组件适配器
ContainerAdapter 容器适配器
FocusAdapter 焦点适配器
keyAdapter 键盘适配器
MouseAdapter 鼠标适配器
MouseMotionAdapter 鼠标运动适配器
WindowAdapter 窗口适配器
2.用内部类实现事件处理器
内部类(inner class)是被定义于另一个类中的类。 使用内部类的主要原因是由于
一个内部类的对象可以访问外部类的成员方法和变量,包括私有的成员
实现事件监听器时,采用内部类、匿名内部类编程非常容易实现其功能
编写事件驱动程序,内部类很方便。
/*
* TestInerClass.java
*
* Created on 2020年11月18日, 上午7:28
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mypkg;
import java.awt.*;
import java.awt.event.*;
public class TestInnerClass {
private Frame f;
private TextField tf;
public void launchFrame(){
f = new Frame("Inner classes example");
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(300,200);
f.setVisible(true);
}
class MyMouseMotionListener extends MouseMotionAdapter{
public void mouseDragged(MouseEvent e){
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[]){
TestInnerClass tic = new TestInnerClass();
tic.launchFrame();
}
}
3.匿名类(Anonymous Class)
当一个内部类的类声明只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类。由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类构造方法。
/*
* AnonymousClass.java
*
* Created on 2020年11月18日, 下午11:25
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mypkg;
import java.awt.*;
import java.awt.event.*;
public class AnonymousClass {
private Frame f;
private TextField tf;
public AnonymousClass(){
f = new Frame("Inner classes example");
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){
String s = "Mouse dragging : x = "+e.getX()+"Y = "+e.getY();
tf.setText(s);
}
}); //匿名类结束
f.addWindowListener(new WindowAdapter(){ //匿名类开始
public void windowClosing(WindowEvent e){
System.out.print(1);
}
});
f.setSize(300,200);
f.setVisible(true);
}
public static void main(String args[]){
AnonymousClass obj = new AnonymousClass();
obj.LaunchFrame();
}
}