2017-04-25 49 views
2

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

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

回答

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; 
    } 
} 

等等...

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

+0

非常感谢您的详细和直接的答案! – Metaphox

+0

@Mepaphox你很受欢迎 – Michael

相关问题