nanquanyuhao吧 关注:15贴子:930
  • 5回复贴,共1

【AWT】 —— 简单界面绘图及鼠标适配器

只看楼主收藏回复






IP属地:山东1楼2012-08-07 10:48回复
    简单解析:
    不废话,直接进主函数:
    创建了一个MyFrame实例,去看MyFrame类的实现;
    MyFrame类继承自Frame类,包含Frame的方法属性的等。。
    声明一个ArrayList的**暂且不管,在构造方法里:
    传入一个字符串对象,调用父类的构造方法,是这个MyFrame的名字,
    创建ArrayList的**并赋值给之前声明的point;
    设置布局管理与位置不多说,
    设置背景颜色与可见也不多说,
    然后为这个MyFrame绑定一个监听器,需要传入一个新建的监听实例!
    此监听器的绑定需要传入一个继承了MouseListener接口的类,
    但是一个鼠标适配器的MouseListener接口有好多方法需要重写,
    而实际本程序只需要一个mousePressed方法即可,
    所以我们只需继承一个实现了MouseListener接口的类即可,
    只需重写继承来的mousePressed方法,恰好JDK提供了这个类MouseAdapter,
    如图所示:

    


    IP属地:山东2楼2012-08-07 11:05
    回复
      接2L..
      监听器绑定完毕,接下来分析监听器触发的操作:
      触发监听器的mousePressed方法需要事件源MouseEvent
      因为事情是在MyFrame上触发耳朵,故事件源MouseEvent就是这个MyFrame。
      e.getSource()之后获得事件源强制转型有Object类变MyFrame类。。
      调用MyFrame类f的addPoint方法:
      很明显,此方法需要传入一个点的对象,此对象的坐标及点击时获得的坐标;
      回到MyFrame类观察addPoint方法:
      points.add(p);
      points即之前创建的ArrayList**,
      此句话就是把点p添加到这个容器里。
      最终我们要分析MyFrame类的paint方法:
      首先创建Iterator对象来遍历整个ArrayList**,
      每当发现里面的一个元素(即一个点),
      现将其强制转型为Point(拿出时候为Object类型),
      然后将画笔颜色设置为蓝色,
      最终画出一个坐标为(p.x, p.y),宽高分别是10,10的椭圆(实际是圆)。
      就是说,每一个调用paint方法时,
      都会把传入ArrayList**的所有点遍历一遍,
      然后挨个变成圆绘制出来。。
      有关系统何时会自动调用paint方法,
      基本是在Frame新建时候,被覆盖还原时候,或者拉伸移动时候。。


      IP属地:山东3楼2012-08-07 11:23
      回复
        f.repaint();
        这方法要拿出来单独说明:
        如果没有这个方法,当你作画后,不会立即进行重绘,
        只有当系统再次调用paint方法才会把你绘制好的东西一下子显示出来。
        也就是说f.repaint();这个方法负责的就是及时的重绘。。
        深一层讲,此方法会先调用update()方法,进一步调用了paint方法而已。。
        注意,无法直接调用paint方法,因为不知传入的画笔graphics在哪或是什么。。
        这里用到了以后会讲的绘图的双缓冲机制,以后再说。


        IP属地:山东4楼2012-08-07 11:29
        回复
          技术贴 建议加精


          5楼2012-08-07 13:13
          收起回复