鼠标适配器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喔。
鼠标适配器Adapter的更多相关文章
- 设计模式--适配器(Adapter)模式
今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...
- 【原】模式之-适配器Adapter模式
适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...
- Ruby设计模式透析之 —— 适配器(Adapter)
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- 理解什么是适配器(adapter)和接口(interface)
● 适配器(adapter) In computing, adapter is a hardware device or software component that converts transm ...
- 设计模式学习心得<适配器 Adapter>
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...
- 安卓开发笔记——打造万能适配器(Adapter)
为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...
- 适配器(Adapter)模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...
- 如何实现 axios 的自定义适配器 adapter
Axios 是一个非常优秀的基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.并且提供了很多便捷的功能,例如: 支持 Promise API 拦截请求和响应 转换请求数据和 ...
- java演示适配器(adapter)模式
为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...
随机推荐
- Visual Studio VS如何修改代码字体
工具-选项-环境-字体和颜色
- srand rand 随机函数
srand函数是随机数发生器的初始化函数.原型:voidsrand(unsigned int seed); srand和rand()配合使用产生伪随机数序列.rand函数在产生随机数前,需要系统提供的 ...
- Struts2框架起源
曾经也用过S2SH框架做过几个项目,都不是工作中的,学习WEB开发的时候接触的第一套框架也是S2SH,可是工作之后一直没实用到S2SH 框架进行开发. 感觉曾经用这个框架的时候根本没有深入去了解这个框 ...
- udhcp源码详解(四) 之租赁IP的管理
Server端对于租赁出去的IP的管理是基于结构体dhcpOfferedAddr的,该结构体的定义是在leases.c文件里:(结构体的成员介绍说明见详解之数据结构) 1: struct dhcpOf ...
- 6 使用Ionic开发天气应用
简介:本节课我们会制作一款天气应用,这款应用允许用户查看当前的天气情况.天气预报以及地点收藏,在模态框内显示日出和日落的数据,使用分页滚动面板显示天气信息,使用侧滑菜单实现导航. 6.1 项目配置 环 ...
- vim怎么把一个写的代码文件另存到任意文件夹里?
比如你要保存到以下路径: D:\my_project\project001\ 那么有两个方法: 1. 直接保存 2. w D:\my_project\project001\xxx.xxx 3. 变更当 ...
- commons-fileupload、smartUpload和commons-net-ftp
1.本地上传 在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能,例如,上传个人相片.共享资料等.在DRP中,就有这个一个功能,需要将对应的物料图片上传并显示.对于上传功能,其实在浏览 ...
- UVALive3126 Taxi Cab Scheme —— 最小路径覆盖
题目链接:https://vjudge.net/problem/UVALive-3126 题解: 最小路径覆盖:即在图中找出尽量少的路径,使得每个结点恰好只存在于一条路径上.其中单独一个点也可以是一条 ...
- android NDK 使用(多个)静态库生成动态库
android NDK 使用(多个)静态库生成动态库. 1.编写Android.mk文件:如下两种方式都可以,用于NDK编译工具生成的两个.a文件来生成最终的libtwolib-second.so动态 ...
- OpenMediaVault 系统安装问题
/********************************************************************* * OpenMediaVault 系统安装问题 * 说明: ...