JAVA MouseEvent实现纪要

Jre1.7鼠标事件以MouseEvent类封装。共有如下8种:

/**

*The"mouseclicked"event.ThisMouseEvent

*occurswhenamousebuttonispressedandreleased.

*/

publicstaticfinalintMOUSE_CLICKED=MOUSE_FIRST;

/**

*The"mousepressed"event.ThisMouseEvent

*occurswhenamousebuttonispusheddown.

*/

publicstaticfinalintMOUSE_PRESSED= 1 +MOUSE_FIRST;//Event.MOUSE_DOWN

/**

*The"mousereleased"event.ThisMouseEvent

*occurswhenamousebuttonisletup.

*/

publicstaticfinalintMOUSE_RELEASED= 2 +MOUSE_FIRST;//Event.MOUSE_UP

/**

*The"mousemoved"event.ThisMouseEvent

*occurswhenthemousepositionchanges.

*/

publicstaticfinalintMOUSE_MOVED= 3 +MOUSE_FIRST;//Event.MOUSE_MOVE

/**

*The"mouseentered"event.ThisMouseEvent

*occurswhenthemousecursorenterstheunobscuredpartofcomponent's

*geometry.

*/

publicstaticfinalintMOUSE_ENTERED= 4 +MOUSE_FIRST;//Event.MOUSE_ENTER

/**

*The"mouseexited"event.ThisMouseEvent

*occurswhenthemousecursorexitstheunobscuredpartofcomponent's

*geometry.

*/

publicstaticfinalintMOUSE_EXITED= 5 +MOUSE_FIRST;//Event.MOUSE_EXIT

/**

*The"mousedragged"event.ThisMouseEvent

*occurswhenthemousepositionchangeswhileamousebuttonispressed.

*/

publicstaticfinalintMOUSE_DRAGGED= 6 +MOUSE_FIRST;//Event.MOUSE_DRAG

/**

*The"mousewheel"event.ThisistheonlyMouseWheelEvent.

*Itoccurswhenamouseequippedwithawheelhasitswheelrotated.

*@since1.4

*/

publicstaticfinalintMOUSE_WHEEL= 7 +MOUSE_FIRST;

鼠标事件由AWT-Windows线程从底层系统获取到并Flush给EDT进行处理。EDT在处理时按一下步骤进行:

1.EventDispatchThread中执行SunDragSourceContextPeer.checkEvent。其功能含义为拖拽开始时将忽略掉当时还在Post Event Queue等待处理的单纯鼠标事件。虽然MouseEvent和拖拽的事件有着千丝万缕的联系,但是在拖拽过程中并不会影响MouseEvent的dispatch.

此前对java拖拽的实现分析已经知道,拖拽开始后AWT-loop到的底层事件将由一个DragSourcePeer在底层处理后直接包装成DragSourceEvent发布到EDT中进行处理,同时由一个DropTargetPeer在底层处理后包装成SunDropTargetEvent发布到EDT中进行处理。SunDropTargetEvent是MouseEvent的子类,而DragSourceEvent就不是。这里面的原因是因为拖拽过程中系统只有一个DragSource,因此DragSourceEvent的target一定是此DragSource组件,只要在拖拽开始时通过一个全局变量记录下来,在封装过程source=DragSourceEvent直接定位到组件即可,但是同一个拖拽过程却可能面临多个DropTarget,而且最关键的是就此底层事件底层系统只能给出对重量级组件的定位,因此对于SunDropTargetEvent需要经过类似MouseEvent的retarget过程确定目标组件,所以SunDropTargetEvent定义为MouseEvent的子类。当然SunDropTargetEvent在经过retarget后再形成具有准确目标组件的DropTargetEvent就和DragSourceEvent一样不再是MouseEvent的子类了。可见,SunDropTargetEvent可以看作是一个中间过渡事件,该类事件存在的主要意义就是借助EDT对MouseEvent的统一retarget过程;也因而在EventQueue,EventDispatchThread类的处理中特别针对该事件有特殊处理。

正因为SunDropTargetEvent的存在,checkEvent这个方法的实现才是忽略单纯的鼠标事件,但不能忽略了SunDropTargetEvent。

if(discardingMouseEvents&& eventinstanceofMouseEvent) {

MouseEvent mouseEvent = (MouseEvent) event;

if(!(mouseEventinstanceofSunDropTargetEvent)) {

returnfalse;

}

}

returntrue;

2.EventQueue中((Component)src).dispatchEvent(event);而在Component中dispatchEventImpl。如果该组件是一个Container,将进入Container. dispatchEventImpl,该方法将通过Container. LightweightDispatcher进行dispatchEvent,其主要功能就是要retarget及在之后针对Mouse_Move updateCursor.

Awt-windows loop到的Mouse Event只能是针对重量级组件的,如果本次点击是在某重量级组件比如JFRAME的一个JTEXTFIELD上点击,需要通过这个过程将此Mouse Event定位source=JTEXTFIELD;同时可能一个重量级组件的MouseMove对应其包含的两个轻量级组件的exit和enter;所有这些具体retarget在processMouseEvent中完成;完成逻辑主要根据鼠标事件的坐标和container的子组件记录,以及组件提供的publicbooleancontains(intx,inty)方法去寻找最顶层包含此坐标的子组件;除了找到该组件外,再根据一个targetLastEntered域变量比较是否发生了变化,如果是则要产生Exit和Enter.

3.Retargeted Mouse Event将进入Component. dispatchEventImpl.

A.如果是SunDropTargetEvent将处理掉并返回。

B.MOUSE_WHEEL将由peer处理后可能被dispatchMouseWheelToAncestor,即交由该组件的合适的容器组件处理。

C.Allow the Toolkit to pass this to AWTEventListeners,即交给Toolkit注册listener处理。

D.newEventsOnly&& eventEnabled则交给该组件对应listener处理。

E.newEventsOnly will be false for a listenerless ScrollPane, but

MouseWheelEvents still need to be dispatched to it so scrolling

can be done.autoProcessMouseWheel方法提供了一个处理鼠标轮滚动的切入点,即如果scrollpane没有注册任何监听导致newEventsOnly=false,也可以实现autoProcessMouseWheel方法来实现通用的scroll。

java mouse_JAVA MouseEvent实现纪要相关推荐

  1. java SWT:MouseEvent,KeyEvent中stateMask字段的用法

    SWT中与键盘鼠标等输入设备有关的事件(MouseEvent,KeyEvent,SelectionEvent GestureEvent TouchEvent)都有一个stateMask字段. 这个字段 ...

  2. java getsour_Java MouseEvent.getSource方法代碼示例

    本文整理匯總了Java中java.awt.event.MouseEvent.getSource方法的典型用法代碼示例.如果您正苦於以下問題:Java MouseEvent.getSource方法的具體 ...

  3. java cutdown_Java MouseEvent.isShortcutDown方法代码示例

    import javafx.scene.input.MouseEvent; //导入方法依赖的package包/类 private void handleSingleClick(MouseEvent ...

  4. java mouseevent_Java MouseEvent位置不准确

    鼠标事件自动转换为相对于它发生的组件,即点0x0始终是组件的左上角. 通过使用RingChart r =((Canvas)e.getSource()).getParent(),您已经有效地更改了引用, ...

  5. TypeScript 4.0的新增功能? Fancier元组

    If you've been doing any web development in the past few years, chances are you've heard a lot about ...

  6. 发那科机器人变量解释_机器人解释

    发那科机器人变量解释 Over the years, as a child who built solar-powered boats and robot arms from science kits ...

  7. 纯属娱乐的涂色绘画系统

    P5.js 之秘密花园--自制线稿上色绘画系统 一.灵感来源 小时候大家肯定都会见过或者玩过这个,砂画 就是给一个模板上面会有轮廓,然后用给好的彩砂颜料上色,画完之后还blingbling的,也是很好 ...

  8. JAVA——鼠标事件(MouseEvent)MouseListener监听器DEMO

    基本概念 MouseEvent:所有组件都能发出鼠标事件,MouseEvent类负责捕获鼠标事件,可以通过为组件添加实现了MouseListener接口的监听器类来处理相应的鼠标事件. MouseLi ...

  9. Java:MouseListener、MouseMotionListener监听器与MouseEvent事件

    目录 1. 监听器-MouseListener(鼠标监听器): 2. 监听器-MouseMotionListener(鼠标运动监听器): 3. 事件类MouseEvent: 链接:JDK文档 3.1 ...

最新文章

  1. 一键抓取sqlserver数据结构
  2. VirtualBox安装kali linux过程及安装后无法全屏问题解决方法(2)
  3. SpringBoot中使用Thymeleaf常用功能(一):表达式访问数据
  4. linux shell if判断字符串是否包含某字符串
  5. 塑壳断路器用考虑启动电流么_塑壳式断路器知识
  6. CSDN博客官方算法故障-随意删除图片记录
  7. 唯一《可解释机器学习》中文书来了:复旦研究生翻译,原作者转发点赞
  8. Linux使用cpuset设置CPU独占
  9. Linux入门之磁盘管理(3)文件系统挂载
  10. 啦啦外卖独立版配送小程序(黑色UI风格)
  11. Oracle如何导出存储过程
  12. 20220601超简单百度地图街景图片爬取+绿视率计算
  13. 【经验总结】CS与MSF之间的会话传递
  14. android 人物走动_Android 中通过切割图片创建人物行走动画
  15. 查计算机主板,如何查看计算机主板的型号
  16. FusionAccess桌面云介绍
  17. 从底特律的覆灭,反思“珠三角”未来
  18. Doris入门到精通-阶段一(简介安装使用)
  19. 指法练习软件ECAI使用指南
  20. apache整合tomcat实现web服务器的动静态资源的分离解析

热门文章

  1. c语言10个评委打分去掉一个最高分,用C语言编程:歌手大奖赛有10名评委打分,去掉一个最高分、去掉一个最低分,求选手的平均分。...
  2. 计算机网络 | 思科网络 | ACL通配符掩码
  3. 株洲科能冲刺上市:计划募资约6亿元,实控人为赵科峰、唐燕夫妇
  4. Housewife Wind
  5. IP地址最简单的解释
  6. 3D 组态编辑器,低代码零代码构建数字孪生工厂
  7. c语言学生成绩统计课设流程图,C语言课程设计————写下流程图! 谢谢
  8. 使用AntiSamy防范XSS跨站脚本攻击
  9. As-Exploits v1.4更新
  10. mybatis(六): MGB生成代码