Javafx 鼠标事件有效,按键事件未被捕获

Javafx mouse events working, key press events not caught

我有一个现有的应用程序,用于移动星形图案的 3d 图(平移、旋转等)

我的鼠标事件(按下、拖动等)工作正常。

我想添加一个键盘事件处理程序,但奇怪的是它从来没有捕捉到任何按键事件。

我定义了一个子场景来管理事物。这是事件设置和处理代码。在下面的代码中,所有鼠标事件都按预期工作。没有记录按键事件。

   private void handleUserEvents() {

        subScene.setOnKeyPressed((KeyEvent key)-> {
            log.info("key={}", key);
        });

        subScene.setOnScroll((ScrollEvent event) -> {
            double deltaY = event.getDeltaY();
            zoomGraph(deltaY * 5);
            updateLabels();
        });

        subScene.setOnMousePressed((MouseEvent me) -> {
                    mousePosX = me.getSceneX();
                    mousePosY = me.getSceneY();
                    mouseOldX = me.getSceneX();
                    mouseOldY = me.getSceneY();
                }
        );

        subScene.setOnMouseDragged((MouseEvent me) -> {
                    int direction = userControls.isControlSense() ? +1 : -1;
                    mouseOldX = mousePosX;
                    mouseOldY = mousePosY;
                    mousePosX = me.getSceneX();
                    mousePosY = me.getSceneY();
                    mouseDeltaX = (mousePosX - mouseOldX);
                    mouseDeltaY = (mousePosY - mouseOldY);
//                    double modifier = 0.2;
                    double modifier = UserControls.NORMAL_SPEED;

                    if (me.isPrimaryButtonDown() && me.isControlDown()) {
                        log.info("shift sideways");
                        camera.setTranslateX(mousePosX);
                        camera.setTranslateY(mousePosY);
                    } else if (me.isPrimaryButtonDown()) {
                        if (me.isAltDown()) { //roll
                            rotateZ.setAngle(((rotateZ.getAngle() + direction * mouseDeltaX * modifier) % 360 + 540) % 360 - 180); // +
                        } else {
                            rotateY.setAngle(((rotateY.getAngle() + direction * mouseDeltaX * modifier) % 360 + 540) % 360 - 180); // +
                            rotateX.setAngle(
                                    clamp(
                                            (((rotateX.getAngle() - direction * mouseDeltaY * modifier) % 360 + 540) % 360 - 180),
                                            -60,
                                            60
                                    )
                            ); // -
                        }
                    }
                    updateLabels();
                }
        );

    }

所以在上面的问题中。我玩弄了一些东西并找到了一个似乎有效的答案。我不太喜欢它,但它很管用...

我在下面的代码中添加了一行“subScene.requestFocus();”这会强制聚焦并使其发挥作用。

 subScene.setOnMousePressed((MouseEvent me) -> {
                    mousePosX = me.getSceneX();
                    mousePosY = me.getSceneY();
                    mouseOldX = me.getSceneX();
                    mouseOldY = me.getSceneY();
                    subScene.requestFocus();
                }
        );