Java 使用接口回調技術實作處理事件的過程,在Java中能觸發事件源的對象,都調用addXXXListener(XXXListener listener)方法将某個對象注冊為自己的監聽器,參數listener是個接口,listener可以引用任何實作了該接口的類的所建立的對象,當事件源發生時,接口listener 立刻回調類實作的接口方法(接口的實作類包含了接口方法和非接口方法,接口隻能調用接口方法,不能調用非接口方法)。
以下是注冊監聽器的幾種常用方法:
1.自身類(this作為監聽器)
package listener_This;
/*
* 自身類作為事件監聽器
* 說明:點選按鈕,程式退出
*/
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class ThisClassEvent extends Applet implements ActionListener{
public ThisClassEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(this); //将自身類作為事件監聽器綁定到jButton上,
//注意這裡 this 不能寫成 new ThisClassEvent()
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0); //程式正常退出
}
}
2.外部類作為監聽器
package listener_Outer;
/*
* 外部類作為事件監聽器
* 說明:建立外部監聽器類OuterClassListener,
* 将OuterClassListener的執行個體對象作為jButton的監聽器
* 注意:使用外部類是值得推薦的,其優點是可以處理事件的代碼和建立GUI的代碼分離,
* 缺點是在監聽器類中無法之間通路元件(外部類可以與主類可以在同一個源檔案)
*/
import java.applet.Applet;
import javax.swing.JButton;
public class OuterClassEvent extends Applet{
public OuterClassEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(new OuterCalssListener());//将OuterClassListener的執行個體對象作為jButton的監聽器
}
}
/***********外部類*************/
package listener_Outer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class OuterCalssListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
}
3.内部類作為監聽器
package listener_Inner;
/*
* 内部類作為監聽器
* 說明:内部類作為監聽器和外部類作為監聽器在實作上并無太大差異,隻是将監聽器類定義在主類外部和内部的差别
*/
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class InnerCalssEvent extends Applet{
public InnerCalssEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(new InnerClassListener()); //内部類InnerClassListener的對象作為監聽器
}
class InnerClassListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
}
}
4.匿名内部類作監聽器
package listener_Anonymity;
/*
* 匿名内部類作為監聽器
* 說明:匿名内部類的聲明格式:
* new 接口() | 父類構造器(參數)
* {
* //類體
* }
*
* 注意:一般 當事件處理方法public void actionPerformed(ActionEvent e)
* 比較簡單時用匿名内部類作為監聽器,否則将影響程式的可讀性
*/
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class AnonymityClassEvent extends Applet{
public AnonymityClassEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(
new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
}
}
5.擴充卡作為監聽器
package listener_Adapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
/*
* 事件擴充卡作監聽器:當實作一個監聽器接口時。必須實作接口中所有的方法,否則這個類就必須聲明為abstract類。
* 有些監聽器接口裡面的方法比較多,如WindowListener(可以檢視API),但是實際應用時往往不用實作所有的方法,
* 這就要用到擴充卡Adapter,Adapter實作了監聽器接口裡面的所有方法,但實際上方法體都為空。是以在實際應用時可以
* 定義一個繼承Adapter的類來作為監聽器,而在這個繼承Adapter的 類中,隻需要實作所需的方法即可。
*
* 下面的程式使用擴充卡WindowAdapter作為監聽器,僅僅處理視窗關閉事件(單擊視窗上的關閉按鈕,程式退出,并列印“Exit”)
*/
public class ListenerAdapter extends JFrame{
public ListenerAdapter(String name){
super(name); //調用JFrame 的構造器
//初始化GUI
setBounds(100, 100, 200, 300);
setVisible(true);
addWindowListener(new MyAdapter() ); // 視窗注冊監聽器
}
//
class MyAdapter extends WindowAdapter{
//重寫 windowClosing方法(WindowAdapter還實作了WindowListener的許多方法,這裡隻用到了windowClosing方法)
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
System.out.println("Exit!");
}
}
public static void main(String[] args){
new ListenerAdapter("視窗擴充卡");
}
}
6.一個元件注冊多個監聽器
package listener_More;
/*
* 一個元件注冊多個監聽器,本程式用匿名内部類作為監聽器
*當該事件被觸發是,多個監聽器都會響應
*/
import java.applet.Applet;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class MoreListener extends Applet{
/**
*
*/
private static final long serialVersionUID = 1L;
public MoreListener(){
JButton jButton = new JButton("Change to Black!");
add(jButton);
setVisible(true);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
setBackground(Color.black); //背景變黑
}
});
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("BLACK"); //向螢幕列印“BLACK!”
}
});
}
}