[英]Release mnemonic when application loses focus
由於一個已知的錯誤,當用戶按下Alt+Tab 鍵切換到另一個程序時,使用MenuBar的 JavaFX 應用程序將保持助記符處於選中狀態(“鎖定”)。 當用戶返回 JavaFX 應用程序時,框架會保留鎖存器。
如果用戶隨后按下對應於助記符的字母,則該字母被消耗並且該菜單被打開。
這種行為不是用戶對應用程序的期望:它會中斷工作流程。 相反, Alt+Tab不應該將應用程序放在可以打開菜單的 state 中。 這將Alt本身合並為使用Alt+Tab觸發菜單,這是一種概念上不同的操作。
其他問題尋求禁用助記符,但我們希望清除閂鎖,以便當用戶返回應用程序時,按字母不會觸發打開菜單。
當按下 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, 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循環 windows 在返回到 JavaFX 應用程序然后按助記鍵(例如“文件”菜單的“f”)時不再打開菜單。
另外,讓場景消費事件:
scene.addEventHandler( KEY_PRESSED, event -> {
final var code = event.getCode();
if( event.isAltDown() && (code == ALT_GRAPH || code == ALT) ) {
event.consume();
}
} );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.