Java 如何找出在Swing应用程序中使用按键事件的原因?
因此,在维护大型Java Swing应用程序时,我遇到了一个问题:从JFileChooser派生的子类的filename textfield中的箭头键不起作用Java 如何找出在Swing应用程序中使用按键事件的原因?,java,eclipse,swing,intellij-idea,Java,Eclipse,Swing,Intellij Idea,因此,在维护大型Java Swing应用程序时,我遇到了一个问题:从JFileChooser派生的子类的filename textfield中的箭头键不起作用 如果我只是将这个类放入一个只有JFrame的小型独立Swing应用程序中,箭头键(特别是左键和右键)将在filename字段中的光标周围移动,但在原始应用程序中它不会工作。我已经检查了它所有容器的所有KeyListener,但找不到任何捕获事件的内容。因此,问题是:在某个或所有按键事件发生时,是否有任何方法可以在调试模式下停止IDE(或在
如果我只是将这个类放入一个只有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;
}
}
等等
通过从这一点仔细跟踪您的应用程序,您应该能够找到事件的消费点。非常感谢您提供了详细而直接的答案!除了下面的优秀答案外,这里还有一些其他有用的信息: