在 Java 中创建 MouseEvent 对象的位置

Where MouseEvent objects are created in Java

我正在尝试跟踪 Java 如何处理鼠标输入。

到目前为止,我了解到只要鼠标设备处于 clicked/moved 状态,其状态的实际数据就会存储在一个文件中(即在 Linux 中它是 /dev/input/mouse0 或鼠标文件),然后 Java 通过 java.io.ObjectInputStream 读取文件并创建 java.awt.MouseEvent 然后由 java.awt.Component(通过 java.awt.AWTEventMulticaster)传递给任何组件的鼠标侦听器,其中处理 MouseEvent 对象。

我的问题是 - 在 Java 中实际创建 MouseEvent 对象的位置?

我对观察者模式和如何处理 MouseEvents 的信息不感兴趣,但是 java.awt.MouseEvent 是如何从鼠标输入创建的。 我希望某处有 "new MouseEvent(...) " 句子,但我无法在任何地方找到它。非常感谢您的帮助。

事件在基础对象内部处理,表示组件,例如对于 AWT,它是 Component.java

如您所见:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/awt/Component.java

正在使用 AWTEventMulticaster: http://docs.oracle.com/javase/7/docs/api/java/awt/AWTEventMulticaster.html

这是 AWTEvents 的高效和线程安全的多播事件调度的实现。

希望我有所帮助。

我使用 IntelliJ IDE 在所有 MouseEvent 构造函数上放置了一个断点,发现 MouseEvent 创建发生在 sun.lwawt.* 包 space 中,(特别是在 Mac 上,但我怀疑其他操作系统也会发生类似的情况)。对于我的机器,堆栈跟踪包含:

    <init>(): 733, MouseEvent (java.awt.event)
    dispatchMouseEvent(): 775, LWWindowPeer (sun.lwawt)
    handleMouseEvent(): 80, CPlatformResponder (sun.lwawt.macosx)
    deliverMouseEvent(): 195, CPlatformView (sun.lwawt.macosx)