任何组件上都可以发生鼠标事件,如:鼠标进进组件、退出组件、在组件上方单击鼠标、拖动鼠标等都发生鼠标事件,也就是说,组件可以成为发生鼠标事件的事件源。

1 使用MouseListener接口处理鼠标事件

使用MouseListener接口可以处理5种操纵发生的鼠标事件:

(1)在事件源上按下鼠标键。mousePressed(MouseEvent )

(2)在事件源上开释鼠标键。mouseReleased(MouseEvent )

(3)在事件源上点击鼠标键。 mouseClicked(MouseEvent )

(4)鼠标进进事件源。 mouseEntered(MouseEvent )

(5)鼠标退失事件源。 mouseExit(MouseEvent )

鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent类自动创建一个事件对象。

MouseEvent类中有下列几个重要的方法:

(1)getX() 获取鼠标在事件源坐标系中的x坐标。

(2)getY() 获取鼠标在事件源坐标系中的y坐标。

(3)getModifiers() 获取鼠标的左键或右键。鼠标的左键和右键分别使用InputEvent类中的常量BUTTONl_MASK和BUTTON3_MASK来表示

(4)getClickCount() 获取鼠标被单击的次数。

(5)getSource() 获取发生鼠标事件的事件源。

事件源获得监视器的方法是addMouseListener(监视器)。

MouseListener接口中有如下方法:

(1)mousePressed(MouseEvent) 负责处理鼠标按下事件。即,当你在事件源按下鼠标时,监视器发现这个事件后将自动调用接口中的这个方法对事件作出处理。

(2)mouseReleased(MouseEvent) 负责处理鼠标开释事件。即,当你在事件源开释鼠标时,监视器发现这个事件后将自动调用接口中的这个方法对事件作出处理。

(3)mouseEntered(MouseEvent) 负责处理鼠标进进事件源事件。即,当鼠标进进时,监视器发现这个事件后将自动调用接口中的这个方法对事件作出处理。

(4)mouseExited(MouseEvent) 负责处理鼠标离开事件。即,当鼠标离开容器时,监视器发现这个事件后将自动调用接口中的这个方法对事件作出处理。

(5)mouseClicked(MouseEvent) 负责处理点击鼠标事件。即,当鼠标被单击时,监视器发现这个事件后将自动调用接口中的这个方法对事件作出处理。

现在我们给出一个小程序mouse1.java,在这个小程序中有一个文本框,它负责记录鼠标事件。当鼠标进进小程序时,文本区显示甲鼠标进来了”;当鼠标离开时,文本区显示“鼠标走开了”;当鼠标被按下时,文本区显示“鼠标按下了”,并显示鼠标的坐标。

在下面例子mouse2.java中,当在画布上按下鼠标左键时,在鼠标位置处绘制一个圆;当按下鼠标右键时,在鼠标位置处绘制一个矩形:当鼠标退出画布时,清除绘制的全部图形。

下面的例子mouse3.java分别监视按钮、文本框和容器上的鼠标事件,当发生鼠标事件时,获取鼠标的坐标值,留意,事件源的坐标系的左上角是坐标源点

2 使用MouseMotionListener接口处理鼠标事件

使用MouseMotionListener接口可以处理两种操纵发生的鼠标事件:

(1)在事件源上拖动鼠标。

(2)在事件源上移动鼠标。

鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent类自动创建一个事件对象。 事件源获得监视器的方法是addMouseMotionListener(监视器)。

MouseMotionListener接口中有如下方法:

(1)mouseDragged(MouseEvent) 负责处理鼠标拖动事件。即,当你在事件源拖动鼠标时,监视器发现这个事件后将自动调用接口中的这个方法对事件作出处理。

(2)mouseMoved(MouseEvent) 负责处理鼠标移动事件。即,当你在事件源移动鼠标时,监视器发现这个事件后将自动调用接口中的这个方法对事件作出处理。

在这里我们也提供一个非常简单的用鼠标作画的小程序mouse4.java。我们的想法很简单,只要我们能用鼠标画点,那么就可以用鼠标自由作画了。我们已经会用drawLine(int x1,int yl,int x2,int y2)画从点(x1,y1)到点(x2,y2)的直线,那么当直线的出发点和终点相同时,就画出了一个点。

现在让我们来分析一下例子4的代码。当我们拖动鼠标时(按着鼠标左键),我们就获得了鼠标拖动时的坐标,同时调用repaint()方法画下这个坐标点。我们已经知道,在小程序中调用repaint方法时,程序首先清除paint()方法以前所画的内容,然后再调用paint()方法。但有时我们不想让程序清除paint()方法以前所画的所有内容。实际上当我们调用

repaint()方法时,程序自动地调用update(Graphics g)方法(从父类Component继续下来的)清除paint()方法以前所画的内容,然后再调用paint方法。因此我们可以在我们的小程序中重写这个update(Graphics g)方法(即隐躲父类的方法),根据需要来清除哪些部分或保存哪些部分。在这个例子中,我们在updatte(Graphics g)方法体内没有清除以前所画的内容(假如预备清除可使用clearrect方法,见17.4节)而是继续调用paint方法。受上面例子的启发,你可能已经想到,我们可以通过画实心圆来改变线条的粗细。下面是一个略微复杂的例子mouse5.java。在这个例子中我们可以控制线条的颜色,而且我们还可以使用橡皮擦掉所画的图形。稍加改进就可以控制线条的粗细,另外还可以使用上一节先容的方法控制鼠标的外形。

3 鼠标事件的转移

假如我们正监视一个容器上的鼠标事件,而容器中添加了一些组件,则当在组件上进行单击鼠标、移动鼠标等操纵时,容器将不知道这些操纵的发生。

可以使用鼠标事件的转移将一个事件源发生的鼠标事件转移到另一个事件源上,也就是说,当用户的在某个事件源上单击鼠标时,可以通过鼠标事件的转移导致另一个事件源上发生鼠标事件(声东击西)。使用javax.swing包中的SwingUtilities类的静态方法:

MouseEvent convertMouseEvent(Component source,MouseEvent sourceEvent,Component destination)

可以将source组件上发生的鼠标事件转移到组件destination,该方法返回转移后的鼠标事件。 在下面的例子mouse6.java中,用户单击一个按钮,然后拖动鼠标移动按钮的位置,观察鼠标事件的转移。

java 中鼠标事件_Java中的鼠标事件相关推荐

  1. java 过滤js事件_java中的过滤器与监听器

    过滤器: Filter本身并不生成请求和响应对象,只是提供过滤功能. Filter能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容:在Ser ...

  2. java 异常处理发生异常_Java中的异常处理

    java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...

  3. java变量存储位置_java 中变量存储位置的区别

    [原文] 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  4. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  5. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  6. java 静态资源变量_Java中读取配置文件中的内容,并将其赋值给静态变量的方法...

    项目开发中某个功能需要抽取成方法写成一个工具类,提供给别人使用.写过工具类的人都知道,工具类中的方法一般都是静态方法,可以直接使用类名点方法名调用, 使用很方便,比如判断某个对象是否为空的方式Obje ...

  7. java 删除list元素_JAVA中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  8. java和equals区别_JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们"实际意义上相等",比较的是内容,而不是引 ...

  9. java为什么要初始化_JAVA中到底要怎么样初始化

    Java中的变量作用范围: 1. 类的属性,或者叫值域 2. 方法里的局部变量 3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化.如果给出了初始值,则初始化为该初始值.如果没有给出,则 ...

  10. java中hashcode作用_Java中hashCode的作用

    以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode  ...

最新文章

  1. 1.3 继承(extends)
  2. leetcode307. Range Sum Query - Mutable
  3. 几种Win7/Windows共享虚拟无线网络的方法及区别
  4. 在php100 防恶意注册这个需要怎么填,WordPress防止恶意注册代码
  5. CSS中的!important属性用法
  6. 使用Python快速压缩目录中图片
  7. 将金额人民币转化为大写 C#
  8. fuel部署openStack
  9. Java知多少(9) import及Java类的搜索路径
  10. matlab intersect
  11. 怎么在pyqt界面上添加新菜单栏选项_PyQt创建菜单栏、工具栏
  12. html认识数字游戏大全,认识HTML列表元素
  13. Ubuntu系统下安装MATLAB2014a
  14. cpu和显卡瓶颈测试软件,CPU与GPU瓶颈的详述
  15. 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
  16. 浅聊前端程序员,后端程序员,全栈程序员的工作
  17. 既可加边也可删边的动态最小生成树
  18. HTML5 Canvas制作数独游戏(一)
  19. 上海应届生落户政策计算机水平,2019年上海应届生落户的加分细则,上海的同学们必看!...
  20. 什么能力很重要,但绝大多数人却没有?

热门文章

  1. 【最强实习生】20场Android面试斩获大厂offer,来看看我都会些什么
  2. bada 2D游戏编程——开篇说明
  3. java是先学前端还是后端_我应该学前端还是后端?
  4. FreeMarker常见指令的简单介绍—快速入门(二)
  5. 手机企业微信下载文件存储地址
  6. 五金机械行业外贸管理软件解决方案
  7. NPOI Word 原有表格增加一行
  8. 误差柱状图的三种实现方法
  9. 计算机机房需要装排烟风机不,送风机房和排烟机房的作用分别是什么
  10. 数据分析之数据分类了解