1. AWT委托事件模型的基本概念及实现事件监听的流程
事件:是指一个状态的改变或者活动的发生。例如,单击窗口关闭按钮,将改变该窗口的状态,产生窗口关闭事件;单击一个按钮,将产生单击事件等。
事件类:不同的事件需要封装成不同的事件类。JAVA在java.awt.event包中定义了许多事件类,如窗口事件类(WindowEvent)和单击事件类(AcitionEvent)等,javax.Swing.event包中也有很多事件类。
事件源:事件源由用户操作产生,产生事件的组件称为事件源。例如,用户单击窗口关闭按钮的操作,产生窗口关闭事件,此时框架窗口组件就是事件源;单击一个按钮,将产生单击事件,此时的按钮组件就是事件源等。
事件监听器:事件发生时被通知的对象。主要分两步实现:事件源注册事件监听器和事件注册方法。
在java.awt.Event包中的每个事件类都有一个对应的接口,在接口中声明了一个或多个抽象事件的处理方法,如ActionListner中的actionPerformed()方法。
如果一个类实现了事件监听器接口,即是注册了事件监听器,那么该类就具备了响应指定事件和事件处理的能力。例如,一个类为一个按钮注册了事件监听器addActionListner,并且实现了ActionListner接口中的actionPerformed()方法,则当单击事件发生时,就能执行actionPerformed()方法。
按钮单击事件的响应处理程序及处理流程为:
用户à单击按钮à事件源(Button)à注册的à单击事件监听器à创建ActionEvent事件对象eà委托执行à执行ActionListner接口中的actionPerformed(ActionEvent e)事件处理方法。
2. 窗口事件实现方案
根据接口的性质,一个类如果实现了一个接口,就必须实现接口中所有的抽象方法。因此,一个类如果要实现一个包含多个方法的接口,即使只需要处理一个事件,也必须实现所有方法,对于不需要响应的事件处理方法也必须设计为空。
JAVA为此提供了一种简便的方法,即事件适配器类,类名带有Adapter标记。这样便引出了窗口事件的两种实现方法:
1) 直接在类中实现接口,对不需要响应的窗口事件置为空
2) 利用窗口适配器(WindowAdapter),继承它,即只需实现需要响应的事件。
3. 实例:一个简单的响应单击事件和窗口事件的计算器程序雏形
该窗口模拟Windows的计算器功能,添加一个文本行和四个按钮,单击【1】,【2】,【+】按钮时,将按钮的标签添加到文本行中;点击【C】按钮时,清空文本行内容;单击窗口的关闭按钮时,将关闭窗口。
程序如下:
import java.awt.event.*;
import java.awt.*;
public class CalculatorFrame extends Frame implements ActionListener
{
private TextField text;
private Button button1,button2,buttonPlus,buttonCancel;
public CalculatorFrame()
{
super("Calculator");
this.setSize(320,120);
this.setBackground(java.awt.Color.lightGray);
this.setLocation(300, 400);
this.setLayout(new java.awt.FlowLayout(FlowLayout.LEFT));
text = new TextField(40);
text.setEditable(false);
this.add(text);
button1 = new Button("1");
button2 = new Button("2");
buttonPlus = new Button("+");
buttonCancel = new Button("C");
this.add(button1);
this.add(button2);
this.add(buttonPlus);
this.add(buttonCancel);
button1.addActionListener(this);
button2.addActionListener(this);
buttonPlus.addActionListener(this);
buttonCancel.addActionListener(this);
this.addWindowListener(new WinClose());
this.setVisible(true);
}
//button event method
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == buttonCancel)
text.setText(" ");
else
text.setText(text.getText()+e.getActionCommand());
}
public static void main(String arg[])
{
new CalculatorFrame();
}
}
//event listener interface implements
class WinClose implements WindowListener
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
//event adapter
class WinClose2 extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
4. 总结
上面对事件响应做了介绍,在GUI设计中,事件响应时重中之重,上面只是对窗口事件类作了一个粗略的介绍,对其他的事件类也有类似的操作方法。