返回

Java KeyListener 失效后重新获得焦点如何恢复响应按键?

Linux

Java KeyListener 失效后重新获取焦点后无法响应按键的解决方法

问题

你是否在使用 Java KeyListener 与 JFrame 时遇到过这样的问题: 当 JFrame 拥有焦点时,KeyListener 正常工作,但如果切换到其他应用程序再返回到 JFrame,KeyListener 则无法响应按键?

解决方法

别担心,这里有一个简单有效的解决方案:

  1. 重新注册 KeyListener: 当 JFrame 重新获得焦点时,重新注册 KeyListener。在 JFrame.addFocusListener() 中添加以下代码:
@Override
public void focusGained(FocusEvent e) {
    addKeyListener(keyListener);
}
  1. 创建新的 KeyListener 对象:focusGained() 方法中,创建一个新的 KeyListener 对象并将其添加到 JFrame。这将覆盖之前的 KeyListener 实例并确保它在重新获得焦点后继续工作。

修改后的代码

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;

public class Gamepad implements KeyListener, FocusListener {

    ... // 省略代码

    @Override
    public void focusGained(FocusEvent e) {
        addKeyListener(this);
    }

    @Override
    public void focusLost(FocusEvent e) {
        // No action needed
    }

}

注意事项

为了确保 KeyListener 正常工作,请注意以下几点:

  1. 重新注册 KeyListener 时,请使用 this 而不是创建新的 KeyListener 对象,因为这样可以避免重新绑定事件处理程序并丢失先前注册的任何监听器。
  2. 请确保 focusGained() 方法仅在 JFrame 重新获得焦点时执行。

常见问题解答

以下是一些常见的与 KeyListener 失效相关的问题以及相应的解答:

  1. 为什么我的 KeyListener 在切换到其他应用程序后无法工作?

    • 这是因为当 JFrame 失去焦点时,KeyListener 将被注销。
  2. 如何防止 KeyListener 被注销?

    • 通过重新注册 KeyListener,如上所述。
  3. 为什么我需要创建新的 KeyListener 对象?

    • 因为之前注册的 KeyListener 实例在 JFrame 失去焦点时已被注销。
  4. 为什么需要在 focusGained() 方法中添加代码?

    • 因为 focusGained() 方法将在 JFrame 重新获得焦点时触发。
  5. 如何在不重新注册 KeyListener 的情况下解决问题?

    • 没有方法可以避免在切换到其他应用程序后注销 KeyListener,因此重新注册是必要的解决方案。