一、事件和事件源
事件:事件可以定义为程序发生了某些事情的信号
源对象(源组件):能创建一个事件并触发该事件的组件成为源对象
事件类的根类:java.util.EventObject
可以使用EventObject类中的实例方法getSource()获得事件的源对象
如果一个组件可以触发某个事件,那么这个事件的任意子类都可以触发同类型的事件,如因为GUI组件的父类Component可以触发MouseEvent、KeyEvent、FocusEvent和ComponentEvent,所以任意的GUI组件都可以触发上述事件
二、监听器、注册以及处理事件
java使用一种基于委托的模型来处理事件:源对象触发一个事件,对此事件感兴趣的对象会处理它。将对此事件感兴趣的对象称为监听器。
一个对象要称为源对象上的事件监听器,需要具备两个条件:
(1)监听器对象的类必须是相应的事件监听器接口的实例,以确保监听器有处理这个事件的正确方法。
(2)监听器对象必须由源对象注册。注册方法依赖于事件的类型。
下面我们编写一个程序,使用两个按钮控制一个圆的大小
ControlCircle1.java
import javax.swing.*;
import java.awt.*;
public class ControlCircle1 extends JFrame{
private JButton jbtEnlarge = new JButton("Enlarge");
private JButton jbtShrink = new JButton("Shrink");
private CirclePanel canvas = new CirclePanel();
public ControlCircle1(){
JPanel panel = new JPanel();//Use the panel to group buttons
//将两个按钮添加到面板中
panel.add(jbtEnlarge);
panel.add(jbtShrink);
this.add(canvas,BorderLayout.CENTER);//将画布添加到中央
this.add(panel,BorderLayout.SOUTH);//将装有两个按钮的面板添加到SOUTH的位置
}
public static void main(String[] args){
JFrame frame = new ControlCircle1();
frame.setTitle("ControlCircle1");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.setVisible(true);
}
}
class CirclePanel extends JPanel{
private int radius = 5;//默认的圆的半径
/**repaint the circle */
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawOval(getWidth()/2-radius,getHeight()/2-radius,2*radius,2*radius);
}
}