首页 > 解决方案 > 尝试使用 KeyboardFocusManager 查找当前聚焦的窗口总是会导致错误消息

问题描述

所以我试图使用 KeyboardFocusManager 获取当前聚焦的窗口,我做了两种方法来尝试实现这一点:

public static void getWindowName() {
    String WindowName = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow().toString();
    System.out.println("Currently opened window: "+WindowName);
}

这导致Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.awt.Window.toString()" because the return value of "java.awt.KeyboardFocusManager.getFocusedWindow()" is null

public static Window getActiveWindow() {
    return KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
}

使用 调用此方法时System.out.println(getActiveWindow());,null 会打印到控制台。在执行程序时,我总是打开并专注于 IntelliJ,我什至尝试专注于另一个程序,任务管理器,同样的结果。这也发生在你身上吗?我能做些什么来解决这个问题,或者还有其他更好和更简单的方法来获取当前在 java 中的焦点窗口吗?我在 Windows 10 上使用 java 15.0.2

标签: javaintellij-ideawindowkeyboardfocusmanager

解决方案


正如java doc所说,“如果焦点窗口不是调用线程上下文的成员,则getFocusedWindow()返回null”那么当您从另一个线程调用它时可能会发生这种情况。因此,为了确保 getFocusedWindow() 没问题,请尝试以编程方式进行焦点:

some_focusable_component.requestFocus();
System.out.println("Currently opened window: "+KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow().toString() );

推荐阅读