[转贴]马士兵Java学习笔记

上一篇 / 下一篇  2011-05-08 17:31:22 / 个人分类:JAVA

1112

Adapter and repaint

 

软件包java.awt.event提供处理由AWT组件所激发的各类事件的接口和类。

比如ActionListener用于接收操作事件的侦听器接口。对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组件的addActionListener方法向该组件注册。
比如KeyListener用于接收键盘事件(击键)的侦听器接口。
比如MouseListener用于接收组件上感兴趣的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口
比如TextListener用于接收文本事件的侦听器接口。
比如WindowListener用于接收窗口事件的侦听器接口。
 
注意到这个问题:ActionListene接口有一个方法public void actionPerformed(ActionEvent e)所以实现这个接口时要重写这个方法。但是MouseListener接口有mouseClickedmousePressed等五个方法,如果实现这个接口则要全部重写这五个方法。哪怕是没有用的,也要写空操作。
 
为了解决这种麻烦可使用适配器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()(这是双缓冲的基础)。

TAG:

 

评分:0

我来说两句

Open Toolbar