【问题标题】:Javafx mouse events working, key press events not caughtJavafx鼠标事件工作,按键事件未捕获
【发布时间】:2021-03-11 04:05:06
【问题描述】:

我有一个现有的应用程序,用于移动星形图案的 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 有焦点吗?
  • 这能回答你的问题吗? JavaFX onKeyPressed event not being handled
  • log.info("key={}", key.getCharacter());这有什么用?
  • Slaw,当我测试它时,我点击子场景用鼠标移动了子场景(使用上面的鼠标事件),我试着敲击键来查看它们是否被记录。所以我相信它有重点,以防没有意义
  • 路西法,按键根本没有被触发,所以特定的改变不会做任何事情。

标签: javafx javafx-11


【解决方案1】:

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

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

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

【讨论】:

  • 好你不喜欢 - 它很脆弱;) 你可以尝试一个 eventFilter - 取决于你的上下文,提供一个 minimal reproducible example 来证明问题可能有助于获得更多帮助 跨度>
  • 是的,没错。它有效,但我不喜欢它。我尝试了一个事件过滤器,但它没有捕获事件。整个应用程序旨在加载 GAIA DR2/3 数据库并呈现真实空间中恒星的 3D 模型(距离等)。它适用于科幻小说作家,以便可以构建对恒星系统的逼真的硬科学描述。构建一个最小版本需要相当多的时间。我想问题是如何集中注意力。单击屏幕使其专注于按键事件的工作。谢谢;)
  • @kleopatra 我不确定我是否同意这很脆弱。如果应用程序有其他 2D 控件,那么我认为用户必须明确聚焦 3D 子场景,然后才能通过键盘与之交互。尽管某些动作(例如程序启动、新数据加载完毕等)可能会自动聚焦 3D 子场景。
  • @Slaw 这对我来说很有意义,用户必须明确关注 基本上同意 - 但在鼠标处理程序中这样做需要鼠标 before 键盘交互正常。这至少是不直观的,并且违反了基本的用户体验指南。我的猜测是在使用或框架中都有问题。同意某些操作(例如启动程序、完成新数据的加载等)应该自动聚焦 :)
  • 好点,但是如何获得焦点以便关键事件起作用。似乎我们陷入了先有鸡还是先有蛋的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多