事件监听器如何识别每种方法中的特定事件?

时间:2013-05-13 20:04:58

标签: 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。为什么在执行事件时事件仅发送到mouseClicked方法?这些方法的构造函数需要任何可能的鼠标事件,所以当其他方法具有相同的构造函数(即mousePressed,mouseReleased等)时,为什么它只被发送到mouseClicked方法

3 个答案:

答案 0 :(得分:5)

The Observer Pattern 是重要的事情。

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

  

模式背后的想法很简单 - 其中一个 Observers   感兴趣的是主题注册的状态   主题通过附加自己。当我们的事情发生变化时    Observer 可能感兴趣的主题,通知消息是   已发送,在每个 Observer 中调用update方法。当。。。的时候    Observer 不再对 Subject的状态感兴趣,他们可以   只需自己动手。

动作侦听器的整个想法基于此。一旦你理解了这种模式,就会很简单。

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

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

http://java.dzone.com/articles/design-patterns-uncovered

答案 1 :(得分:3)

当您实现它,创建对象并将该对象注册到事件源时,这样的接口开始变得有用。注册部分在这里至关重要 - 如果您注册鼠标点击事件,那么这就是对象将收到的内容。

所以基本上这些界面看起来很相似,因为它们用于处理类似事件,但最后只会告知您注册的事件。这里没有魔法 - 事件源在内部保存对某些事件感兴趣的侦听器集合,如果发生这样的事件,它会遍历集合并调用侦听器方法。

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

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;
              ...


}

答案 2 :(得分:-1)

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