java - 如何使 setOnKeyPressed 与 MouseEvent.mouse_entered 一起使用?

标签 java events javafx mouseevent

我在使 setOnKeyPressed 方法与 MouseEvent.MOUSE_ENTERED 一起使用时遇到困难。我的目标是仅当鼠标位于舞台中的节点(更准确地说是形状)上时才运行 setOnKeyPressed 事件,但即使鼠标不在形状上,也会调用我的 setOnKeyPressed 方法。 这是我创建形状的方法:

Circle circle= new Figura().createCircle(40, 50, 50, Color.BLACK);
root.getChildren().add(circle);
circle.setCenterX(stage.getWidth()/2);
circle.setCenterY(stage.getHeight()/2);
addMouseScrolling(circle);          
addKeyPressed(circle); // this handle the 'KeyPressed' and 'Mouse_Entered' events
circle.requestFocus();

这是我处理 mouseEvent + setOnKeyPressed 内容的方法:

public void addKeyPressed(Node node) {
   node.addEventFilter(MouseEvent.MOUSE_ENTERED, e -> {
       node.setOnKeyPressed(t -> {

           if (t.getCode()==KeyCode.R) System.out.println("Key "R" pressed!");
       });
    });

}

正如我所说,我希望仅当鼠标位于节点上方时才调用 setOnKeyPressed 方法,现在我始终调用它,而不仅仅是鼠标位于节点上方时:我创建了圆圈(仅创建它并不使 setonkeypressed 工作)然后我单击它,从现在开始,当我在任何地方按“r”时,我都会在控制台上打印“按下“R”键”。我希望我清楚地解释了我的问题。 提前致谢。

最佳答案

最简单的方法是使用 KeyEvent.KEY_PRESSED 处理程序,并将 if (node.isHover) { ... } 添加到您的处理程序中:

public void addKeyPressed(Node node) {
    node.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
        if (node.isHover()) {
            if (e.getCode()==KeyCode.R) System.out.println("Key "R" pressed!");
        }
    });
}

您还可以通过添加和删除按键事件处理程序来完成此操作,如下所示:

public void addKeyPressed(Node node) {
    EventHandler<KeyEvent> keyHandler = e -> {
        if (e.getCode() == KeyCode.R) {
            System.out.println("Key \"R\" pressed!");
        }
    } ;
    node.addEventHandler(MouseEvent.MOUSE_ENTERED, e -> {
        node.addEventHandler(KeyEvent.KEY_PRESSED, keyHandler);
    });
    node.addEventHandler(MouseEvent.MOUSE_EXITED, e -> {
        node.removeEventHandler(KeyEvent.KEY_PRESSED, keyHandler);
    });
}

此版本允许您在鼠标进入节点时自动请求焦点在该节点上。只需修改鼠标输入的处理程序:

    node.addEventHandler(MouseEvent.MOUSE_ENTERED, e -> {
        node.addEventHandler(KeyEvent.KEY_PRESSED, keyHandler);
        node.requestFocus();
    });

关于java - 如何使 setOnKeyPressed 与 MouseEvent.mouse_entered 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48356752/

相关文章:

JavaFX切换场景

java - 按名称对枚举值排序

javascript - 查找 Javascript 何时暂停(很难总结)

css - 在 GridPane (JavaFX) 中用点填充 2 个标签之间的空间

java - 如何对 FXML 中的不同按钮使用相同的事件

java - 如何等待发送进程

java - Tomcat 8 元空间内存不足问题

javascript - 如何使用 Javascript 捕捉 youtube 视频播放器的播放/暂停事件?

multithreading - POSIX 的扩展允许 select() 或等效函数终止进程

combobox - 一个组合框中的选定项目如何更改第二个组合框中的特定项目?