`
netbaixc_gmail_com
  • 浏览: 55324 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA MouseEvent实现纪要

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

/**

     *The"mouseclicked"event.This<code>MouseEvent</code>

     *occurswhenamousebuttonispressedandreleased.

     */

    publicstaticfinalintMOUSE_CLICKED = MOUSE_FIRST;

    /**

     *The"mousepressed"event.This<code>MouseEvent</code>

     *occurswhenamousebuttonispusheddown.

     */

    publicstaticfinalintMOUSE_PRESSED = 1 + MOUSE_FIRST; //Event.MOUSE_DOWN

    /**

     *The"mousereleased"event.This<code>MouseEvent</code>

     *occurswhenamousebuttonisletup.

     */

    publicstaticfinalintMOUSE_RELEASED = 2 + MOUSE_FIRST; //Event.MOUSE_UP

    /**

     *The"mousemoved"event.This<code>MouseEvent</code>

     *occurswhenthemousepositionchanges.

     */

    publicstaticfinalintMOUSE_MOVED = 3 + MOUSE_FIRST; //Event.MOUSE_MOVE

    /**

     *The"mouseentered"event.This<code>MouseEvent</code>

     *occurswhenthemousecursorenterstheunobscuredpartofcomponent's

     *geometry.

     */

    publicstaticfinalintMOUSE_ENTERED = 4 + MOUSE_FIRST; //Event.MOUSE_ENTER

    /**

     *The"mouseexited"event.This<code>MouseEvent</code>

     *occurswhenthemousecursorexitstheunobscuredpartofcomponent's

     *geometry.

     */

    publicstaticfinalintMOUSE_EXITED = 5 + MOUSE_FIRST; //Event.MOUSE_EXIT

    /**

     *The"mousedragged"event.This<code>MouseEvent</code>

     *occurswhenthemousepositionchangeswhileamousebuttonispressed.

     */

    publicstaticfinalintMOUSE_DRAGGED = 6 + MOUSE_FIRST; //Event.MOUSE_DRAG

    /**

     *The"mousewheel"event. Thisistheonly<code>MouseWheelEvent</code>.

     *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 && event instanceof MouseEvent) {

              MouseEvent mouseEvent = (MouseEvent) event;

              if (!(mouseEvent instanceof SunDropTargetEvent)) {

                   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的子组件记录,以及组件提供的publicboolean contains(int x, int y) 方法去寻找最顶层包含此坐标的子组件;除了找到该组件外,再根据一个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实现拖拽列表项的排序功能

    总结一下,Java实现拖拽列表项的排序功能主要包括以下步骤: 1. 启用UI组件的拖放功能,如设置`AllowDrop`、`CanReorderItems`和`IsSwipeEnabled`属性。 2. 监听并处理拖放事件,更新数据模型以反映拖放操作。 3. ...

    java窗体 实现图片拖动 实例代码

    在Java编程环境中,开发图形用户界面(GUI)时,我们经常需要实现用户友好的功能,例如拖放操作。本实例代码主要关注如何在Java窗体中实现图片的拖动功能。我们将探讨Java AWT和Swing库中的相关API,以及如何通过`...

    Java鼠标事件MouseEvent

    当在一个组件上按下,释放,点击,移动或拖动鼠标时就会产生鼠标事件。MouseEvent对象捕获这个事件.

    java实现图片中心放大、缩小、移动、鼠标拖移

    在Java编程语言中,处理图像是...通过以上步骤,我们可以在Java中实现一个功能齐全的图像处理组件,能够支持图片的中心放大、缩小、移动以及鼠标拖移。这在开发涉及图像交互的应用,如地图应用或图像编辑器时非常有用。

    Java实现屏幕截取程序(区域内截屏)更新

    在这个特定的案例中,我们讨论的是一个Java实现的屏幕截取程序,允许用户进行区域内的截屏操作。这通常涉及到图形用户界面(GUI)的创建、事件监听以及图像处理等多个技术领域。 首先,我们需要理解如何在Java中...

    在Windows下实现Java程序的屏幕鼠标键盘监控.pdf

    在探讨如何在Windows环境下利用Java实现对屏幕、鼠标和键盘的监控之前,我们先要理解Java在处理此类事件上的基本框架以及其局限性。Java通过AWT(Abstract Window Toolkit)和Swing库提供了多种事件监听接口,如...

    java swing实现的坦克大战

    本项目“java swing实现的坦克大战”是利用Java Swing框架编写的坦克战斗游戏,旨在为初学者提供一个实践与学习的平台。下面我们将深入探讨该项目涉及的技术点和实现原理。 首先,Java Swing是Java AWT(Abstract ...

    java事件 适配器实现鼠标事件 实例代码

    import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; public class MouseAdaptorExample { public static void main(String[] args) { JFrame frame = new JFrame("Mouse ...

    Java实现屏幕取色

    ### Java实现屏幕取色 #### 一、引言 在软件开发中,有时我们需要获取屏幕上的特定像素颜色,比如在图像处理、颜色检测或者辅助工具等场景中。使用Java实现屏幕取色是一种实用且常见的需求。本文将详细介绍如何...

    Java实现的简单画图程序

    在Java编程语言中,开发一个简单的画图程序可以利用Java的图形用户界面(GUI)库,如Java AWT...这只是一个基础的实现,实际的图形编辑软件会包含更多功能和优化,但这个例子展示了Java实现此类应用的基本原理。

    JAVA中的鼠标双击事件

    在 Java 中,实现鼠标双击事件是 GUI 桌面开发中一个重要的功能。然而,Java 中并没有提供直接的鼠标双击事件。于是,我们需要通过其他方法来实现鼠标双击事件。 首先,我们可以通过事件源 `e.getClickCount()==2` ...

    java鼠标钩子实现

    在Java中,实现鼠标钩子通常涉及到使用Java的`java.awt.MouseInfo`和`java.awt.event.MouseEvent`类,以及可能的`java.lang.reflect.Method`用于钩入系统级别的事件处理。 首先,`MouseInfo`类提供了获取鼠标状态的...

    计算几何求凸包算法的java实现

    在给定的Java程序中,“计算几何求凸包算法的java实现”是解决这个问题的关键。 这个Java代码实现了对离散点集进行求解凸包的过程。在图形用户界面中,用户可以通过鼠标点击生成点,程序会实时地计算这些点的凸包并...

    java画图,可实现画图的简单功能

    根据提供的文件信息,我们可以总结出以下关于 Java 画图程序的知识点: ### 1. Java AWT 和 Swing 组件 该程序使用了 Java 的 AWT(Abstract Window Toolkit)和 Swing 库来创建图形用户界面(GUI)。AWT 是 Java ...

    Java画笔程序代码,以实现窗口的形式运行

    import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.util.Vector; import javax.swing.JFrame; ``` 这段代码导入了程序运行所需的类库,包括`Graphics`用于绘图,`Point`...

    基于Java的实现跟踪鼠标运行坐标的源码.zip

    这个压缩包"基于Java的实现跟踪鼠标运行坐标的源码.zip"包含了一个示例项目,帮助开发者了解如何在Java Swing或AWT环境中获取并处理鼠标的移动事件。以下是关于这个主题的详细讲解。 1. **Java Swing和AWT** Java...

    java 使用WindowAdapter实现鼠标事件

    首先,`WindowAdapter`是Java AWT(Abstract Window Toolkit)库中的一个类,它是`WindowListener`接口的匿名实现。`WindowListener`接口包含了一些窗口事件的处理方法,如窗口打开、关闭、最大化、最小化等。`...

    基于java的实现跟踪鼠标运行坐标的源码.zip

    这个"基于java的实现跟踪鼠标运行坐标的源码.zip"文件很可能包含了一个简单的Java应用程序,该程序展示了如何捕获并显示鼠标在窗口中的位置。下面我们将深入探讨这个主题,讲解如何在Java中实现鼠标追踪功能。 首先...

    java 会移动的图像

    本文将深入探讨如何在Java中实现这一功能,基于提供的"MoveImage.java"源代码文件和"Java.jpg"图片资源。 首先,理解Java中的图像处理涉及到`java.awt`和`javax.swing`两个主要的图形库。`java.awt`库提供了基本的...

    Java实现简单的画板

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个简单的画板应用程序。这个程序允许用户在图形用户界面上绘制各种基本形状,如线条、矩形、圆形等,从而提供了一个基本的绘画环境。 首先,我们需要引入Java...

Global site tag (gtag.js) - Google Analytics