gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:50:07 24 4
gpt4 key购买 nike

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

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

最佳答案

我这样做的方法是在 java\awt\Component.java 中放置一个断点。您应该能够在 JDK 中找到它。这是将所有事件分派(dispatch)给您注册的监听器的方法:

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:

AWTEventMulticaster
{
first_listener_you_added;
AWTEventMulticaster
{
second_listener_you_added;
third_listener_you_added;
}
}

等等……

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

关于java - 如何找出在 Swing 应用程序中消耗 KeyPressed 事件的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43615503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com