1112
Adapter and
repaint
软件包java.awt.event提供处理由AWT组件所激发的各类事件的接口和类。
比如ActionListener用于接收操作事件的侦听器接口。对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组件的addActionListener方法向该组件注册。
比如KeyListener用于接收键盘事件(击键)的侦听器接口。
比如MouseListener用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口
比如TextListener用于接收文本事件的侦听器接口。
比如WindowListener用于接收窗口事件的侦听器接口。
注意到这个问题:ActionListene接口有一个方法public void actionPerformed(ActionEvent e)所以实现这个接口时要重写这个方法。但是MouseListener接口有mouseClicked,mousePressed等五个方法,如果实现这个接口则要全部重写这五个方法。哪怕是没有用的,也要写空操作。
为了解决这种麻烦可使用适配器Adapter。适配器都实现了相应的接口(相当于适配器是这些接口的子类)。比且在这些适配器里都有被实现的接口里的方法的空操作。使用适配器时根据自身需要重写某方法即可。比如java.awt.event.MouseAdapter实现MouseListener接口,可使用其子类(MouseAdapter)作为MouseEvent的监听器,只要重写其相应的方法即可,即public abstract class MouseAdapter extendsObjectimplementsMouseListener,MouseWheelListener,MouseMotionListener
接收鼠标事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。对于其他的监听器,也有对应的适配器。使用适配器可以避免监听器类定义没有必要的空方法。
例子:
import
java.awt.*;
import
java.awt.event.*;
import
java.util.*;
public class
MyMouseAdapter{
public static void
main(String args[]) {
new MyFrame("drawing...");
}
}
class MyFrame. extends Frame.
{
ArrayList points =
null;
MyFrame(String s)
{
super(s);
points =
new ArrayList();
setLayout(null);
setBounds(300,300,400,300);
this.setBackground(new Color(204,204,255));
setVisible(true);
this.addMouseListener(new
Monitor());//给此Frame添加监听器。Frame的父类Component有此方法public void addMouseListener(MouseListener l)添加指定的鼠标侦听器,以接收发自此组件的鼠标事件。参数:l -鼠标侦听器
}
public void paint(Graphics g) {
Iterator i = points.iterator();
while(i.hasNext()){
Point p = (Point)i.next();
g.setColor(Color.BLUE);
g.fillOval(p.x,p.y,10,10);// p.x,p.y即鼠标点在哪里则在哪开始画圆
}
}
public void
addPoint(Point p){
points.add(p);//把点都加进points
}
}
class Monitor extends
MouseAdapter {//不实现MouseListener而是继承MouseAdapter
public void
mousePressed(MouseEvent e) {
MyFrame. f = (MyFrame)e.getSource();
f.addPoint(new Point(e.getX(),e.getY()));
f.repaint();//
}
}
分析f.repaint()。Component类的方法public void repaint()重绘此组件。在此f.repaint()使此Frame强制重画,若不repaint()那么你虽然点击了鼠标,但是看不见这些点,因为没有重画。深层原因:调用repaint()时先调用了update()再调用了paint()(这是双缓冲的基础)。