Java 事件侦听器如何识别每个方法中的特定事件?

Java 事件侦听器如何识别每个方法中的特定事件?,java,events,user-interface,Java,Events,User Interface,我很难理解的是,像 public interface MouseListener extends EventListener { public void mouseClicked(MouseEvent e) { //code for what happens when you click the mouse on the component } } 知道鼠标事件的id。为什么只有在执行事件时才将事件发送到mouseCl

我很难理解的是,像

    public interface MouseListener extends EventListener {

        public void mouseClicked(MouseEvent e) {
             //code for what happens when you click the mouse on the component
        }
    }

知道鼠标事件的id。为什么只有在执行事件时才将事件发送到mouseClicked方法?这些方法的构造函数调用任何可能的鼠标事件,那么为什么只有当其他方法具有相同的构造函数(即mousePressed、MouseRelease等)时,才会将其发送给mouseClicked方法呢?

当您实现它、创建对象并将该对象注册到事件源时,这样的接口才开始有用。注册部分在这里很重要-如果您注册到鼠标单击事件,那么对象将收到该事件

因此,基本上这些接口看起来很相似,因为它们用于处理类似的事件,但最终只会通知您注册到的事件。这里没有什么神奇之处——事件源在内部保存对某个事件感兴趣的侦听器的集合,如果发生这样的事件,它将迭代该集合并调用侦听器方法

例如,您提到的鼠标侦听器界面有两种方法:

public interface MouseListener extends EventListener {
    public void mouseClicked(MouseEvent e);
    public void mousePressed(MouseEvent e);
    ...
}
如果查看
java.awt.Component
类的一部分,您会发现它是 注意调用正确的方法:

public abstract class Component implements ImageObserver, MenuContainer,
                                       Serializable
{
...
    protected void processMouseEvent(MouseEvent e) {
        MouseListener listener = mouseListener;
        if (listener != null) {
            int id = e.getID();
            switch(id) {
              case MouseEvent.MOUSE_PRESSED:
                  listener.mousePressed(e); // invoking a specific listener's method
                  break;
              case MouseEvent.MOUSE_RELEASED:
                  listener.mouseReleased(e);
                  break;
              ...


}
是需要知道的重要事情

此模式用于在运行时形成对象之间的关系

这个模式背后的想法很简单——更多的观察者中有一个是 对受试者的状态感兴趣登记他们的兴趣 通过连接它们自己来连接主题。当我们的生活发生变化时 观察者可能感兴趣的主题是通知消息 sent,它在每个观察者中调用update方法。当 观察者不再对主体的状态感兴趣,他们可以 只需脱掉衣服

行动听众的整个想法就是基于此。一旦你理解了这个模式,就很简单了

注册ActionListener时,它是观察者,按钮是主题。因此,当按钮改变状态时,actionPerformed方法将启动

请注意,所有侦听器都基于此模式,当事件发生时,将通知已注册的侦听器此事件并执行操作。例如,Swing自己管理所有的注册和事件通知(它已经“内置”)


()

注册事件时,将侦听器传递给您想要听到的对象。此对象保留一个它感兴趣的对象列表,如果发生了值得通知的事情,则它会在该列表上迭代并调用通知方法。

我看不出您的答案与该问题有何关联。他不是在问如何实现这样的侦听器,他是在问它背后的机制是什么这正是我想要的。我一直在浏览javadocs,我想我错过了这一部分。谢谢。我的评论是关于你答案的第一个版本。自从我第一次发表评论以来,你的答案有所改进,所以现在是的,它描述了一点机制。对不起,我不太明白。你可能想重新表述你的问题。“这些方法的构造函数”-方法没有构造函数。你是说方法签名吗?是的,我道歉。正如你所看到的,我对这个很陌生。