因此,在维护大型Java Swing应用程序时,我遇到了一个问题:从JFileChooser派生的子类的文件名文本字段中的箭头键不起作用。
如果我只是将这个类放入一个只有JFrame的小型独立Swing应用程序中,箭头键(特别是左右)将在文件名字段中的光标周围移动就好了,但它不会在原始申请中工作。我检查了所有容器的所有KeyListener,但无法找到捕获事件的任何内容。所以问题是:在某些或所有KeyPress事件上,有没有办法在调试模式下停止IDE(或者在没有IDE的情况下调试问题的任何方法)?
答案 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;
}
}
依旧......
通过仔细跟踪您的应用程序,您应该能够找到事件被消耗的位置。