我正在开发一个Java Swing应用程序。我希望实现以下效果:按快捷键显示应用程序窗口,再次按快捷键或单击其他地方可隐藏应用程序。
我使用jkeymaster来注册全局快捷键事件监听器,并且它运行良好。但是当用户聚焦于其他窗口(如Chrome、Office等)时,焦点窗口将是其他应用程序。然后如果用户使用快捷键,我的应用程序窗口仍将显示出来,但无法获得焦点。有人能帮我解决这个问题吗?以下是我的代码片段。
Provider provider = Provider.getCurrentProvider(true);
// bind shortcut
provider.register(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), x -> {
homePage.setVisible(!homePage.isVisible());
if(homePage.isVisible()){
// TODO: 2020/10/1 request focus here
homePage.requestFocusInWindow();
homePage.requestFocus();
KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
focusManager.clearGlobalFocusOwner();
log.info("hasFocus? " + homePage.hasFocus());
log.info("isActive? " + homePage.isActive());
}
});
我的尝试:
- 使用requestFocus和requestFocusInWindow方法,但没有效果
- 我阅读了requestFocus的源代码,它指出
* This method cannot be used to set the focus owner to no Component at
* all. Use <code>KeyboardFocusManager.clearGlobalFocusOwner()</code>
* instead.
我尝试了focusManager.clearGlobalFocusOwner(),但仍然无效。
grabFocus()
会起作用? - camickr