鼠标适配器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喔。