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喔。

  • 相关阅读:
    设置多台机器linux服务器ssh相互无密码访问
    linux环境下 卸载 Oracle11G
    树型结构递归 实体递归 JSON格式
    Fiddler工具非常强大好用
    SQL 分页 SQL SERVER 2008
    Html table 细边框
    Oracle用户密码过期的处理方法
    将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药
    微软帮你做了枚举的位运算
    根据身份证算出生日期和性别
  • 原文地址:https://www.cnblogs.com/wangshen31/p/6940585.html
Copyright © 2011-2022 走看看