JavaFX - 当文本字段具有焦点时加速器不起作用



在我的应用程序中,我有一个使用加速器的屏幕。我正在使用功能键 F3 在我的应用程序中执行操作。它每次都工作正常,但是当我单击此屏幕上的任何文本字段时,功能键不会执行。

这是我设置加速器的代码:

    scene.getAccelerators().put(
            new KeyCodeCombination(KeyCode.F3),
            new Runnable() {
                @Override
                public void run() {
                    // do sth here
                }
            }
    );

当我单击我的文本字段,然后按 F3 功能键时,它不起作用。有人知道解决方案吗?

适用于我使用 Java 1.8.0_45。但是,我在可编辑的组合框字段中遇到了类似的问题。

编辑:

经过进一步调查,它似乎也发生在文本字段中。我使用以下自定义类代替文本字段来解决此问题:

public class ShortcutFriendlyTextField extends TextField{
    public ShortcutFriendlyTextField() {
        super();
        addEventHandler(KeyEvent.KEY_RELEASED,new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                //handle shortcuts if defined
                Runnable r=getScene().getAccelerators().get(new KeyCodeCombination(event.getCode()));
                if(r!=null) {
                    r.run();  
                }
            }
        }); 
    }
}

这个答案是基于蒂克曼的。我添加了代码来处理修饰键。

if (!event.getCode().isModifierKey()) {
    Consumer<KeyCombination.Modifier[]> runAccelerator = (modifiers) -> {
        Runnable r = getScene().getAccelerators().get(new KeyCodeCombination(event.getCode(), modifiers));
        if (r != null) {
            r.run();
        }
    };
    List<KeyCombination.Modifier> modifiers = new ArrayList<>();
    if (event.isControlDown()) modifiers.add(KeyCodeCombination.CONTROL_DOWN);
    if (event.isShiftDown()) modifiers.add(KeyCodeCombination.SHIFT_DOWN);
    if (event.isAltDown()) modifiers.add(KeyCodeCombination.ALT_DOWN);
    runAccelerator.apply(modifiers.toArray(new KeyCombination.Modifier[modifiers.size()]));
}

编辑:修复消费者拼写。

如果您设置了其他加速器,例如 MenuBar,则使用其他一些解决方案将导致快捷方式执行两次。

就我而言,将修饰符与我的快捷方式 (SHIFT + F3) 一起使用时在文本区域中处于焦点状态时有效,但在仅使用加速器(例如 F3)时则不行。

我将我的设置为仅将事件处理程序用于不使用修饰符的快捷方式。

public  static final double JAVA_VERSION = Double.parseDouble(System.getProperty("java.specification.version"));
public static void makeInputFieldShortCutFriendly(Node node) {
    //this bug wasn't fixed until 9.0
    if (JAVA_VERSION < 9) {
        node.addEventHandler(KeyEvent.KEY_RELEASED, (KeyEvent event) -> {
            if (!event.getCode().isModifierKey()) {
                if (!event.isAltDown() && !event.isShiftDown() && !event.isAltDown()) {
                    Runnable r = node.getScene().getAccelerators().get(new KeyCodeCombination(event.getCode(), KeyCodeCombination.SHORTCUT_ANY));
                    if (r != null) {
                        r.run();
                    }
                }
            }
        });
    }
}

编辑:Java 9中没有修复任何修饰符快捷方式。鉴于JDK 8现在的流行,我们可能应该提供一些向后的能力或要求用户将JRE更新到9+。

我正在使用JavaFx + Scene builder,然后只需创建一个将所有事件重定向到相应函数的函数,然后将此功能添加到场景中的每个元素中使用OnKeyRelease事件

最新更新