【问题标题】:Release mnemonic when application loses focus应用程序失去焦点时释放助记符
【发布时间】:2021-01-17 20:34:59
【问题描述】:

背景

由于known bug,当用户按下Alt+Tab 切换到另一个程序时,使用MenuBar 的JavaFX 应用程序将保持助记符被选中(“锁定”)。当用户返回 JavaFX 应用程序时,框架会保留闩锁。

问题

如果用户随后按下与助记符相对应的字母,则该字母被消费并打开该菜单。

这种行为不是用户对应用程序的期望:它会中断工作流程。相反,Alt+Tab 不应将应用程序置于菜单可以打开的状态。这将 Alt 本身混为一谈,用 Alt+Tab 触发菜单,这是一个概念上不同的操作。

其他questions寻求禁用助记符,但我们想清除闩锁,这样当用户返回应用程序时,按字母不会触发打开菜单。

问题

当按下 Alt+Tab(即失去应用程序焦点)时,如何指示 JavaFX 应用程序清除锁定的助记符?

【问题讨论】:

    标签: javafx menu window


    【解决方案1】:

    这个解决方案有几个部分:释放助记符并使用 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();
      }
    } );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多