簡體   English   中英

應用程序失去焦點時釋放助記符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM