zoukankan      html  css  js  c++  java
  • 鼠标适配器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喔。

  • 相关阅读:
    maven 的依赖包的版本更改之后,项目启动报错,相关联的资源没有在tomcat里面加载
    Maven更新后本地仓库jar后缀带有 lastUpdated
    spring+mybatis之声明式事务管理初识(小实例)
    java 详解类加载器的双亲委派及打破双亲委派
    jvm内存溢出区域和排查方法
    JVM中的新生代和老年代(Eden空间、两个Survior空间)
    什么情况下会发生堆内存溢出,栈内存溢出,结合实例说明
    投而死面试
    检查性异常
    多线程系列课程
  • 原文地址:https://www.cnblogs.com/wangshen31/p/6940585.html
Copyright © 2011-2022 走看看