【发布时间】:2020-10-01 15:09:44
【问题描述】:
我正在开发一个 java swing 应用程序。我希望达到这样的结果:按下快捷方式让应用程序窗口出现。再次按下快捷键或点击其他地方让应用隐藏。
我使用jkeymaster注册监听全局快捷键事件,效果很好。 但是当用户关注其他一些窗口时,比如 chrome、office ......焦点窗口将是其他应用程序。然后如果用户使用快捷方式。我的应用程序窗口仍会显示,但无法获得焦点。谁能帮我解决它。这是我的代码 sn-p。
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 感谢您的建议,但 JFrame 有 grabFocus 方法。我尝试了 homePage.getRootPane().grabFocus() 但仍然无效。