目录
图形用户界面要响应用户的操作,例如,单击按钮或移动鼠标等,就必须提供相应的事件处理机制。Java Swing采用AWT事件处理模型,在事件处理过程中涉及的主要概念有事件、事件源、事件处理方法、事件监听器类和事件监听器接口等。
1. 事件处理机制
事件是用户在界面上的一个操作,通常使用各种输入设备来实现,例如,鼠标、键盘等。当一个事件发生时,该事件用一个事件对象来表示。事件对象有对应的事件类,不同的事件类描述不同类型的用户动作。事件类包含在java.awt.event和javax.swing.event包中,例如,单击按钮事件类是java.awt.event.ActionEvent。每个事件类对应一个接口,该接口称为监听器接口,它规定了接收并处理该类事件的方法规范。例如,对应于ActionEvent事件,有监听器接口ActionListener,该接口中只定义了一个方法:public void actionPerformed(ActionEvent e),当出现ActionEvent事件时,该方法被调用。
产生事件的组件叫做事件源。例如,在一个按钮上单击鼠标时,该按钮就是事件源,该动作会产生一个ActionEvent类型的事件对象。在Java中,事件处理者是一个接收事件对象并进行相应处理的方法,这个方法包含在一个对象中,该对象称为事件监听器,其所对应的类称为事件监听器类。事件监听器负责检查事件是否发生,若发生就激活事件处理方法进行处理。事件监听器类必须实现相应的事件监听器接口或者继承某个事件监听器适配器类。事件监听器接口定义了处理事件必须实现的方法,事件监听器适配器类是对事件监听器接口的简单实现,目的是为了减少编程的工作量。
为了能够让事件监听器检查某个组件(事件源)是否发生了某些事件,并且在发生时激活事件处理方法进行相应的处理,必须在事件源上注册事件监听器,这是通过使用事件源组件的方法addXxxListener(事件监听器)来实现的,其中,Xxx为相应的事件类。例如,在JButton类中有如下方法:
public void addActionListener(ActionListener l);
该方法可以为Jbutton组件注册ActionListener事件监听器。
【例1】下面代码演示使用内部类和匿名类的方式实现ActionEvent事件处理。
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class ActionEventDemo extends JFrame{
JLabel label=new JLabel("Hello!");
JButton button1=new JButton("确定");
JButton button2=new JButton("取消");
JPanel panel=new JPanel();
public ActionEventDemo() {
this.setTitle("我的窗口");
this.setSize(300,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane=this.getContentPane();
panel.add(button1);
panel.add(button2);
//注册button1的事件事件监听器(内部类的方式)
button1.addActionListener(new ActionEventHandler());
//注册button2的事件事件监听器(匿名类的方式)
button2.addActionListener(new ActionListener() {
//事件处理方法
public void actionPerformed(ActionEvent e) {
label.setText("你单击取消按钮");
}
});
contentPane.add(label,BorderLayout.CENTER);
contentPane.add(panel,BorderLayout.SOUTH);
this.setVisible(true);
}
//事件监听器类(内部类)
class ActionEventHandler implements ActionListener{
//事件处理方法
public void actionPerformed(ActionEvent e) {
label.setText("你单击确定按钮");
}
}
public static void main(String[] args) {
ActionEventDemo frame=new ActionEventDemo();
}
}
运行上述程序,显示结果如图1(a)所示。单击确定按钮,显示结果如图1(b),单击取消按钮,显示结果如图1(c)所示。该程序的第22行和第24行分别是注册按钮button1和button2的事件监听器,其中,第22行的事件监听器是一个内部类ActionEventHandler的实例,第24行的事件监听器是一个匿名类。
(a) |
(b) |
(c) |
图1. ActionEvent事件处理示例
【例2】下面代码演示采用实现ActionListener接口的方式处理ActionEvent事件。
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
im