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,我想我错过了这一部分。谢谢。我的评论是关于你答案的第一个版本。自从我第一次发表评论以来,你的答案有所改进,所以现在是的,它描述了一点机制。对不起,我不太明白。你可能想重新表述你的问题。“这些方法的构造函数”-方法没有构造函数。你是说方法签名吗?是的,我道歉。正如你所看到的,我对这个很陌生。