鼠标适配器Adapter

先来看看概念:

现在我们要写一个这样的东西,就是一个窗口,然后鼠标点一下就有一个小圆点,like this:

来我们来看代码:

import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class MyMouseAdapter {
    public static void main(String[] args) {
        new MyFrame("drawing……");
    }
}

class MyFrame extends Frame {
    ArrayList points = null;//搞一个list来装点

    public MyFrame(String titleBar) {
        super(titleBar);
        points = new ArrayList();
        setLayout(null);//布局管理器调成null
        setBounds(300,300,800,700);
        setBackground(new Color(204,204,255));
        setVisible(true);
        addMouseListener(new Monitor());//搞一个鼠标事件的监听器1111
    }

    public void addPoint(Point p) {//加点的方法
        points.add(p);
    }

    public void paint(Graphics g){//重写这个paint方法
        Iterator i = points.iterator();//搞个容器的迭代器做遍历
        while(i.hasNext()) {  //用循环其实是很容易理解的,调用paint其实是把这个图重新画出来,所以不只是画我们新点的那个点,应该还要还原前面的
            Color c = g.getColor();
            Point p = (Point)i.next();
            g.setColor(Color.BLUE);
            g.fillOval(p.x,p.y,10,10);
            g.setColor(c);
        }
    }

}

class Monitor extends MouseAdapter { //继承鼠标适配器22222
    public void mousePressed(MouseEvent e) { //重写按压鼠标的这个方法,哪个元件添加了这个监听器,事件e就是哪个对象的
        MyFrame f = (MyFrame)e.getSource();//现在引用f指的其实就是上面(同一个)我们的那个MyFrame对象
        f.addPoint(new Point(e.getX(),e.getY()));//拿到鼠标点的那个位置的坐标,Point这个类是j2se本来就有的
        f.repaint();//333333重新把这个页面画过!
    }
}

这个程序有好几个知识点:

1.

addMouseListener(new Monitor());

这是为frame添加鼠标监听器,类比button等component的监听器

这个addMouseListener()的参数是个MouseListener,查了api文档发现这是个接口,里面有五个方法。什么mouseClicked(),mouseEntered……接口我们知道,要实现一个接口要重写它所有的方法,但这里有五个方法,我们要用的只是它的一个mousePressed(),我们又不能只重写这一个(语法不允许),其他还要都重写不是很麻烦?

所以有了adapter这个东西

class Monitor extends MouseAdapter

这是我们这个monitor类的定义,会发现它没有实现mouseListener这个接口,而是集成了MouseAdapter这个类。MouseAdapter这个类其实就已经把接口里那五个方法都实现过一次了(方法体是空的),然后你要做的就只是把你要用的那个方法给重写了。

2.

public void mousePressed(MouseEvent e) 

这个MouseEvent就是这个鼠标对应的事件。它是怎么传过来的呢?哪个对象添加了这个监听器就哪个对象传过来。

3.

f.repaint();

这句话很重要,就顾名思义,是起着重画的作用,简单地理解就是刷新这个图的作用。

这句话让我们的frame强调进行重画,当你调用repaint的时候,方法的内部调用了paint方法。

跟深层次一点看,实际上调用了repaint后,它调用了update方法,然后update方法再调用了paint方法。(当然也有可能repaint调用了update再又调用了paint)  这也是大多数图形系统采用的一个机制。

这里说不能直接用paint,因为那个画笔graphics不知道谁给……所以只能用repaint喔。

原文地址:https://www.cnblogs.com/wangshen31/p/6940585.html