【问题标题】:How MouseMotionListener in java works?java中的MouseMotionListener如何工作?
【发布时间】:2014-05-08 13:04:55
【问题描述】:

我对如何在幕后使用 MouseMotionListener 感到困惑

  • 它是java awt中的一个接口
  • 但是这里我们不是调用它定义的方法,而是实现它并描述我们自己的定义

例如,我认为接口就是这样做的

Interface A {
    method work();
}

类 ConcreteA {

method work(){
//implementation goes here
 }

}

然后客户端代码可以调用任何实现A接口的类并调用其工作方法

classImplementingA.work()

但这里我们实现了 MouseMotionListener 并将我们自己的定义添加到它公开的 MouseDragged、mouseMoved 方法中。

所以我想知道

内部java调用这个接口方法是否依次调用我们定义的方法或其他东西

即 java 内部的工作方式类似于此接口的客户端代码,我们定义了幕后实现。

所以请有人告诉我java是如何处理鼠标移动并使这个界面以一种简单的方式工作的。

【问题讨论】:

    标签: java api oop interface


    【解决方案1】:

    侦听器通常基于可观察/观察者模式。

    让我们举一个更简单的例子:ActionListener。你想“观察”一个按钮。因此,您是观察者,而按钮是可观察的。你创建了一个ActionListener 的实例,从而覆盖了它的actionPerformed 方法。然后将此侦听器添加到按钮。现在,每次单击该按钮时,都会通过调用其actionPerformed 方法来回调(通知)侦听器。

    MouseMotionListener 使用相同的原理:创建MouseMotionListener 的实例并将其添加到 Swing 组件。然后,每次鼠标在该组件内移动时,该组件都会通过调用其方法之一(mouseDraggedmouseMoved,取决于是否按下鼠标按钮)回调(通知)侦听器。

    所以,是的,你是对的。在这种情况下,接口的客户端不是您自己的代码,而是 Swing 组件。他们是您定义的接口实现的调用者。

    【讨论】:

    • 非常感谢,现在我明白了。再次感谢 observable/observer 模式 ;)
    • @themightysapien:神奇之处在于组件的源代码中,操作系统会通知它发生鼠标事件,然后组件本身会通知所有注册的侦听器这些更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多