如何解决当应用程序失去焦点时释放助记符
背景
由于 known bug,当用户按 Alt+Tab 切换到另一个时,使用 MenuBar 的 JavaFX 应用程序将保持选中(“锁定”)助记符程序。当用户返回 JavaFX 应用程序时,框架会保留闩锁。
问题
如果用户随后按下与助记符对应的字母,则该字母被消耗并打开该菜单。
这种行为不是用户对应用程序的期望:它会中断工作流程。相反,Alt+Tab 不应将应用程序置于菜单可以打开的状态。这将 Alt 本身混为一谈以触发带有 Alt+Tab 的菜单,这是一个概念上不同的操作。
其他 questions 试图禁用助记符,但我们希望清除闩锁,以便当用户返回应用程序时,按下字母不会触发打开菜单。
问题
当按下 Alt+Tab(即应用程序焦点丢失)时,您如何指示 JavaFX 应用程序清除锁定的助记符?
解决方法
此解决方案有几个部分:释放助记符和消耗 Alt 按键。请务必同时实施。
释放助记符
解决该错误的一种方法是向应用程序的 Stage 添加焦点侦听器,该侦听器为所有已知助记符触发键释放事件。给定一个 Stage
实例,我们可以按如下方式遍历所有主菜单助记符:
stage.focusedProperty().addListener( ( c,lost,show ) -> {
if( lost ) {
for( final var mnemonics : stage.getScene().getMnemonics().values() ) {
for( final var mnemonic : mnemonics ) {
mnemonic.getNode().fireEvent( keyUp( ALT,false ) );
}
}
}
else if( show ) {
// Make sure the menu does not capture focus.
stage.getScene().focusOwnerProperty().get().requestFocus();
}
} );
我们需要一些辅助方法来创建按键释放事件:
public static Event keyDown( final KeyCode code,final boolean shift ) {
return keyEvent( KEY_PRESSED,code,shift );
}
public static Event keyUp( final KeyCode code,final boolean shift ) {
return keyEvent( KEY_RELEASED,shift );
}
private static Event keyEvent(
final EventType<KeyEvent> type,final KeyCode code,final boolean shift ) {
return new KeyEvent(
type,"",shift,false,false
);
}
使用这些方法后,通过按 Alt+Tab 循环窗口不再在返回 JavaFX 应用程序时打开菜单,然后按助记键(例如“f”代表“文件" 菜单)。
消费事件
另外,让场景消费事件:
scene.addEventHandler( KEY_PRESSED,event -> {
final var code = event.getCode();
if( event.isAltDown() && (code == ALT_GRAPH || code == ALT) ) {
event.consume();
}
} );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。