这个解决方案有几个部分:释放助记符并使用 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, code, shift );
}
private static Event keyEvent(
final EventType<KeyEvent> type, final KeyCode code, final boolean shift ) {
return new KeyEvent(
type, "", "", code, shift, false, 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();
}
} );