Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找出在Swing应用程序中使用按键事件的原因?_Java_Eclipse_Swing_Intellij Idea - Fatal编程技术网

Java 如何找出在Swing应用程序中使用按键事件的原因?

Java 如何找出在Swing应用程序中使用按键事件的原因?,java,eclipse,swing,intellij-idea,Java,Eclipse,Swing,Intellij Idea,因此,在维护大型Java Swing应用程序时,我遇到了一个问题:从JFileChooser派生的子类的filename textfield中的箭头键不起作用 如果我只是将这个类放入一个只有JFrame的小型独立Swing应用程序中,箭头键(特别是左键和右键)将在filename字段中的光标周围移动,但在原始应用程序中它不会工作。我已经检查了它所有容器的所有KeyListener,但找不到任何捕获事件的内容。因此,问题是:在某个或所有按键事件发生时,是否有任何方法可以在调试模式下停止IDE(或在

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


如果我只是将这个类放入一个只有JFrame的小型独立Swing应用程序中,箭头键(特别是左键和右键)将在filename字段中的光标周围移动,但在原始应用程序中它不会工作。我已经检查了它所有容器的所有KeyListener,但找不到任何捕获事件的内容。因此,问题是:在某个或所有按键事件发生时,是否有任何方法可以在调试模式下停止IDE(或在没有IDE的情况下调试问题)?

我这样做的方法是在
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;
        }
    }
}
如果有多个侦听器,则本例中的
keysister
变量有点不直观。您可能希望它按照添加侦听器的顺序在侦听器列表上迭代。事实上,它使用了一个名为
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;
   }
}
等等


通过从这一点仔细跟踪您的应用程序,您应该能够找到事件的消费点。

非常感谢您提供了详细而直接的答案!除了下面的优秀答案外,这里还有一些其他有用的信息: