如何找出在Swing应用程序中消耗KeyPressed事件的内容?

时间:2017-04-25 15:52:53

标签: java eclipse swing intellij-idea

因此,在维护大型Java Swing应用程序时,我遇到了一个问题:从JFileChooser派生的子类的文件名文本字段中的箭头键不起作用。

如果我只是将这个类放入一个只有JFrame的小型独立Swing应用程序中,箭头键(特别是左右)将在文件名字段中的光标周围移动就好了,但它不会在原始申请中工作。我检查了所有容器的所有KeyListener,但无法找到捕获事件的任何内容。所以问题是:在某些或所有KeyPress事件上,有没有办法在调试模式下停止IDE(或者在没有IDE的情况下调试问题的任何方法)?

1 个答案:

答案 0 :(得分:2)

我这样做的方法是在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;
   }
}

依旧......

通过仔细跟踪您的应用程序,您应该能够找到事件被消耗的位置。

相关问题