我无法理解的是一个方法,例如
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方法
答案 0 :(得分:5)
The Observer Pattern 是重要的事情。
此模式用于在运行时在对象之间形成关系。
模式背后的想法很简单 - 其中一个 Observers 感兴趣的是主题和注册的状态 主题通过附加自己。当我们的事情发生变化时 Observer 可能感兴趣的主题,通知消息是 已发送,在每个 Observer 中调用update方法。当。。。的时候 Observer 不再对 Subject的状态感兴趣,他们可以 只需自己动手。
动作侦听器的整个想法基于此。一旦你理解了这种模式,就会很简单。
注册 ActionListener 时,它是观察者,按钮是主题。因此,当按钮更改状态时,将启动 actionPerformed 方法。
请注意,所有侦听器都基于此模式,当事件发生时,注册的将通知此事件并执行操作。例如,Swing自己管理所有注册和事件通知(它已经“内置”)。
答案 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)
当您注册该事件时,您将侦听器传递给您想要听到的对象。该对象保留了一个感兴趣的对象列表,如果发生了需要通知的事情,那么它会迭代列表并调用通知方法。