先来看看概念:

现在我们要写一个这样的东西,就是一个窗口,然后鼠标点一下就有一个小圆点,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喔。

鼠标适配器Adapter的更多相关文章

  1. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  2. 【原】模式之-适配器Adapter模式

    适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...

  3. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  4. 理解什么是适配器(adapter)和接口(interface)

    ● 适配器(adapter) In computing, adapter is a hardware device or software component that converts transm ...

  5. 设计模式学习心得<适配器 Adapter>

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...

  6. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  7. 适配器(Adapter)模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...

  8. 如何实现 axios 的自定义适配器 adapter

    Axios 是一个非常优秀的基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.并且提供了很多便捷的功能,例如: 支持 Promise API 拦截请求和响应 转换请求数据和 ...

  9. java演示适配器(adapter)模式

    为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...

随机推荐

  1. 高端技巧:怎样使用#define定义变量

    Introduction 想在源文件里定义一个跟行号有关的变量,每次都手动输入实在是太慢了.本文介绍怎样使用宏定义来定义与行号有关的变量. 比如:我们想在源码的第10行定义A_10这种一个整形变量. ...

  2. sqlzoo练习答案--SELECT within SELECT Tutorial

    This tutorial looks at how we can use SELECT statements within SELECT statements to perform more com ...

  3. Mybatis加入Ehcache支持

    1.Mybatis默认的缓存配置 MyBatis 包括一个很强大的查询缓存特性,它能够很方便地配置和定制. Mybatis缓存包括全局的缓存和局部的缓存.全局的缓存能够讲主配置文件的setting属性 ...

  4. FPGA第一篇:SRAM工作原理

    一.SRAM概述 SRAM主要用于二级快速缓存(Level2 C ache). 它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在同样面积中SRAM的容量要比其它类型的内存小. 大部分FP ...

  5. Essay

    要养成先连续输入一对匹配的字符——比如"("和")",以及"{"和"}"——再在其中填写内容的习惯.如果先填写内容,很容 ...

  6. (原创)EasyUI中datagrid的行编辑模式中,找到特定的Editor,并为其添加事件

    有时候在行编辑的时候,一个编辑框的值要根据其它编辑框的值进行变化,那么可以通过在开启编辑时,找到特定的Editor,为其添加事件 // 绑定事件, index为当前编辑行 var editors = ...

  7. Redhat Linux 下安装Oracle 11g R2

    能够下载:http://download.csdn.net/detail/ykh554541184/8086647文档方便查阅 官方文档:http://docs.oracle.com/cd/E1188 ...

  8. UESTC149 解救小Q

    小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她.迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头.现在请你 ...

  9. 线程之间的通信socketpair【学习笔记】【原创】

    平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在一个进程中多个线程如何进行通信,主要 ...

  10. YTU 2955: A改错题--销售部的打印机

    2955: A改错题--销售部的打印机 时间限制: 1 Sec  内存限制: 128 MB 提交: 61  解决: 47 题目描述 销售部新进了一台快速打印机,使用频率很高.为了能够对打印情况进行统计 ...