我会这样做的方式是在java\awt\Component.java
内部放置一个断点。您应该能够在您的JDK中找到它。这是调度所有事件到你所注册的侦听器的方法:
protected void processKeyEvent(KeyEvent e) {
KeyListener listener = keyListener;
if (listener != null) {
int id = e.getID();
switch(id) {
case KeyEvent.KEY_TYPED:
listener.keyTyped(e);
break;
case KeyEvent.KEY_PRESSED:
listener.keyPressed(e);
break;
case KeyEvent.KEY_RELEASED:
listener.keyReleased(e);
break;
}
}
}
在这种情况下,KeyListener
变量是一点点的非直观的,如果你有一个以上的听众。您可能期望它按照添加的顺序遍历侦听器列表。如果事实上,它使用一个名为AWTEventMulticaster
的复合对象,它基本上只是一对听众。
如果有两个侦听器的结构非常简单:
AWTEventMulticaster
{
first_listener_you_added;
second_listener_you_added;
}
如果你有三个监听器,结构使用嵌套Multicaster
S:
AWTEventMulticaster
{
first_listener_you_added;
AWTEventMulticaster
{
second_listener_you_added;
third_listener_you_added;
}
}
等等...
通过从这一点仔细追踪您的应用程序,您应该能够找到事件消耗的位置。
非常感谢您的详细和直接的答案! – Metaphox
@Mepaphox你很受欢迎 – Michael