找到哪个键触发了 DOM "keydown" 事件(使用 JavaFX WebEngine)?

Find which key triggered DOM "keydown" event (using JavaFX WebEngine)?

当 WebEngine 完成加载页面时,它会向文本输入元素添加一个 "keydown" 侦听器。 如何从侦听器中检索按下的键?

webEngine.getLoadWorker().stateProperty()
        .addListener((ObservableValue<? extends State> ov, State oldState, 
                State newState) -> {
                    if (newState == State.SUCCEEDED) {
                        Document doc = webEngine.getDocument();
                        Element ele = doc.getElementById("someInputField");

                        ((EventTarget) ele).addEventListener("keydown", (event) -> {
                        //if triggering key is 'ENTER'
                            doSomeMethod();
                    }, false);

                }
            });

事件是com.sun.webkit.dom.KeyboardEventImpl,所以您可以通过getKeyCode()getCharCode()获得Key。不要忘记 shift、ctrl 等元键.... (getAltKey(), getCtrlKey(), getShiftKey(), getMetaKey())。

获取类型最快的方法是反射。但有时调试器不想告诉你类型。那你可以用一个老招数println.

((EventTarget) ele).addEventListener("keydown", (event) -> {
    //if triggering key is 'ENTER'
    System.out.println(event.toString());
    if ("Enter".contentEquals(((com.sun.webkit.dom.KeyboardEventImpl) event).getKeyIdentifier())) {
        System.out.println("keydown on Enter");
    }
}, false);

另一种解决 java lambda 调试问题的方法是,不要使用它们。

 ((EventTarget) ele).addEventListener("keydown", new EventListener() {

    @Override
    public void handleEvent(Event evt) {
        System.out.println(String.valueOf(((com.sun.webkit.dom.KeyboardEventImpl) evt).getKeyCode()));
        com.sun.webkit.dom.KeyboardEventImpl event = (com.sun.webkit.dom.KeyboardEventImpl) evt;
        System.out.println(event.getKeyIdentifier());
    }
}, false);

我觉得,我老了....