JavaFX 菜单栏抢走了焦点

问题描述 投票:0回答:1

我有一个应用程序,当用户输入文本输入时,输入普通字母会导致菜单栏激活(下拉其子菜单),而不是按应有的方式填充输入。

查看此问题的最简单方法是获取 SceneBuilder,下拉面板和面积图,然后开始在“标题”字段中输入内容。我输入“The”,“e”导致“编辑”菜单下拉,如图所示。

它并不总是发生,如果您退出菜单栏,它就会消失,所以我认为这是某种 MenuBar 状态问题。

我想知道如何使 MenuBar 尊重输入的主权,如果有修复,为什么它在 SceneBuilder 下表现如此?

目前在 Windows 上使用 SceneBuilder v18,尽管我已经看到这可以追溯到 v12 或 v13。始终在 Windows 上。

编辑:继续@Slaw的建议,我认为真正的问题是,一旦使用Alt激活菜单栏,它就永远不会停用,直到您再次按Alt。因此,您可以按 Alt,为各种输入提供焦点并在其中键入内容,拖放新控件...基本上在菜单栏等待击键时执行任何操作。

所需的行为是菜单栏仅在按下 Alt 时激活 如果下一个键未激活,则放弃焦点。不要等待,让所有击键都过去,直到它能够扑向其中一个。

javafx scenebuilder gluon
1个回答
1
投票

当舞台重新获得焦点时,将 Esc 按键事件发送到菜单栏。您需要更改下面代码中的变量名称以匹配您自己的代码库中的变量名称。

// After the app loses focus, when the user switches back using Alt+Tab,
// the menu is engaged on Windows. Simulate an ESC keypress to the menu
// to disable the menu, giving focus back to the application proper.
//
// JavaFX Bug: https://bugs.openjdk.java.net/browse/JDK-8090647
stage.focusedProperty().addListener( ( c, lost, found ) -> {
  if( found ) {
    mMainScene.getMenuBar().fireEvent( keyDown( ESCAPE, false ) );
  }
} );

public static Event keyDown( final KeyCode code, final boolean shift ) {
  return keyEvent( KEY_PRESSED, 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
  );
}

在 Windows 10、Java 19 和 JavaFX 19 上测试。

请注意,此错误已在 JavaFX 21 中得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.