本文系作者学习资料整理,不足之处请大家指正,谢谢!
本文参考资料:《java se6 全方位学习》 朱仲杰编著 机械工业出版社
java事件处理架构
一个java事件包含三部分1.事件本身 2.事件来源 3.谁来处理
以点击窗口的右上角的叉来说,点击叉是事件本身,而窗口则是事件的来源,选择谁来处理需要我们自己设定,也就是一个操作,一个组件,还有一个方法。只不过这个方法是一个自定义的新类的方法。
java的委托事件模式(Delegation Event Model)
这种模式就是来处理用谁来处理事件的。我们委托某个类来处理事件时,那么这个类需要继承相应的事件类或实现相应的事件接口,如xxxAdapter,xxxListener。并且需要将这个类向组件注册,否则在组件上发生的事件不会传到自定义类的方法中去处理。例子1如下:
import java.awt.*;
import java.awt.event.*;
public class WindowEventTest{
public static void main(String[ ] args)
{
Frame f = new Frame( "WindowEventTest");
f.setSize(600,400);
f.setVisible(true);
f.addWindowListener(new WindowEventHandler);
//将自定义类WindowEventHandler注册到组件(即由Frame类生成的一个对象f)
// 对于不同的事件,需要不同的addxxxListener方法。
}
}
// 自定义类WindowEventHandler
// class WindowEventHandler implements WindowListener
// 我们不选实现接口(WindowListener),而选择继承类(WindowAdapter),原因在于实现接口要实
// 现接口里的所以方法,而WindowAdapter类已经为我们实现接口WindowListener中所有方法,
// 当然都是空实现,我们要做的只是重写我们需要的方法。
class WindowEventHandler extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0); // 表示当点击窗口右上角的叉时,关闭窗口,退出程序
}
}
注:在上面的例子中,我们列出了事件处理的基本内容:
我们需要一个事件来源,即一个Frame对象;事件本身是点击窗口右上角的叉;如何处理,即我们委托自定义类来处理,当然这个自定义类需要继承相应的事件类(xxxAdapter),或实现相应的接口(xxxListener);
例子2:
当然我们可以调用public 这个类,也就是类WindowEventTest2来当做事件的处理者,这样的话我们需要将自己(也就是public这个类)注册组件中,形如f.addWindowListener(this); 上面程序可以改写为:
import java.awt.*;
import java.awt.event.*;
public class WindowEventTest2 extends WindowAdapter{ //本身这个类要继承或实现
Frame f ; // 将Frame 对象f 作为 public类的属性,那么public类中的所有方法都可以调用。
public static void main(String[ ] args)
{
new WindowEventTest2( ); // 生成一个WindowEventTest对象
}
public WindowEventTest2( ) // 构造函数,在它内部进行初始化
{
f = new Frame("WindowEventTest2");
f.addWindowListener(this); //委托WindowEventTest2,也就是自己本身,所以用this
f.setSize(600,400);
f.setVisible(true);
}
public void windowClosing(WindowEvent e)
{
System.exit(0); // 表示当点击窗口右上角的叉时,关闭窗口,退出程序
}
}
注:
1.我们需要使public类继承Adapter类或实现Listener接口,当然可以实现多个接口用来处理不同的事件。
2.因为this不能用在static方法中,所以不能在main方法中使用,所以设计了构造函数来进行初始化和将类本身向组件注册。
后面我们将使用匿名内部类来代替自定义类,这样我们省去了给一个自定义类取一个有意义的名字的麻烦。