gpt4 book ai didi

Java接口(interface)MouseMotionListener抽象方法: What's behind the scene?

转载 作者:行者123 更新时间:2023-12-01 16:18:14 26 4
gpt4 key购买 nike

我只是想知道接口(interface)中的抽象方法是如何做这些事情的。例如,在 MouseMotionListener 接口(interface)中,我必须实现 2 个抽象方法,即:

void mouseDragged(MouseEvent 事件)
void mouseMoved(MouseEvent 事件)

代码片段A:

    public class MouseMotionHandler implements MouseMotionListener {

@Override
public void mouseMoved(MouseEvent event) {
if(find(event.getPoint()) == null)
setCursor(Cursor.getDefaultCursor());
else
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
@Override
public void mouseDragged(MouseEvent event) {
if(current != null) {

double x = event.getX();
double y = event.getY();

current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
repaint();
}
}
}

但是当我像这样交换他们的陈述时......

代码片段B:

    public class MouseMotionHandler implements MouseMotionListener {

@Override
public void mouseMoved(MouseEvent event) {
if(current != null) {

double x = event.getX();
double y = event.getY();

current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
repaint();
}
}
@Override
public void mouseDragged(MouseEvent event) {
if(find(event.getPoint()) == null)
setCursor(Cursor.getDefaultCursor());
else
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}

它的行为有所不同。为什么代码 AB 会产生不同的结果,而这两种方法只是抽象的 - 意味着没有在 MouseMotionListener 中实现它们,以执行诸如确定鼠标被移动或拖动之类的操作,但仅在我创建的类中实现它们,其中我在实现中使用的代码实际上并不知道鼠标是否被拖动或搬家?是否还有其他代码在这两个抽象方法背后工作,但未在 API 或其他地方显示?

最佳答案

我必须承认,我并没有真正了解幕后发生的事情,但通常操作系统(无论您使用什么)都会通知任何想要收到鼠标事件通知的人,在这种情况下可能是所有 AWT 类的一部分是所有图形内容和输入等的基础。因此,现在当您的操作系统收到鼠标事件时,它们可以通知任何人。但要做到这一点,您必须首先告诉相应的 Java 代码您(或者更确切地说是您实例化的对象)想要收到有关鼠标事件的通知。所以你要做的就是订阅这个 Activity 。您可以通过调用组件的 addMouseMotionListener(MouseMotionListener m) 方法(所有组件都有此方法)来完成此操作。现在这个组件保存了你的MouseMotionListener。这可以通过下面的示例代码中的列表来完成。

因此,要添加 MML,您必须创建一个新类,该类实现 MouseMotionListener 接口(interface)。现在您还必须在此类中创建两个方法 mouseMoved 和 mouseDragged (将逻辑放在其中)。

那么这有什么意义呢?最简单的想象方式是每个组件都有一个 MML(和其他监听器)列表。您之前已将自己的添加到列表中。现在,当鼠标事件发生时,某些 Java 类会从操作系统接收该事件。无论有什么逻辑,你都不需要详细理解它。您唯一需要知道的是,最终您的组件还将收到它以及 MouseEvent,其中包含有关所发生事件的所有信息(x 和 y 位置等)。现在,它可以调用一个名为“notifyEveryoneWhoWantedToBeNotifiedOfMouseEvents”之类的方法,并且只会迭代 MML 列表并调用您之前实现的两个方法,这就是为什么您的代码必须位于这两个方法内的原因。当然,这并不完全是它的实现方式,但想法是相同的。

    //Example of how the inside of such a class could look like

//List of all the objects that want to be notified
List<MouseMotionListener> subscriptionList = new LinkedList();

public void addMouseMotionListener(MouseMotionListener mouseMotionListener)
{
subscriptionList.add(mouseMotionListener);
}

//iterate through all the subscribers and call their methods
public void notifyEveryoneWhoWantedToBeNotifiedOfMouseEvents(MouseEvent e) {

for(MouseMotionListener subscriber : subscriptionList)
{
subscriber.mouseDragged(e);
subscriber.mouseMoved(e);
}
}

关于Java接口(interface)MouseMotionListener抽象方法: What's behind the scene?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62346284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com