【问题标题】:In JavaFX firing an event when the mouse is pressed and enters a node在 JavaFX 中,当鼠标按下并进入节点时触发事件
【发布时间】:2021-07-12 11:03:22
【问题描述】:

在 JavaFX 中,如何在鼠标进入节点并按下主按钮时触发事件? MOUSE_ENTERED 在这里不起作用,因为按下鼠标按钮时它不会触发事件。我是 JavaFX 的新手,没有发现任何有用的谷歌搜索。

【问题讨论】:

  • 阅读MouseEvent 的Javadoc 中描述的不同类型的“手势”。从您的描述来看,您似乎想要一个“完全按下-拖动-释放”的手势。

标签: java user-interface javafx


【解决方案1】:

MOUSE_ENTERED 事件未触发,因为单击 + 移动算作拖动。然而,MOUSE_DRAGGED 事件仅在拖动源上触发。所以我能想到实现这一点的唯一方法是监听场景中的拖动事件,并根据您的标准进行过滤:

Button button = new Button("MyButton");
StackPane sp = new StackPane(button);
scene = new Scene(sp, 600, 600);
scene.setOnMouseDragged(ev -> {
    if (ev.getButton() != MouseButton.PRIMARY) return;
    if (ev.getPickResult().getIntersectedNode() != button && !button.getChildrenUnmodifiable().contains(ev.getPickResult().getIntersectedNode())) return;
    System.out.println("Hovered over the button while mouse button is pressed!");
});

getPickResult().getIntersectedNode() 返回当前拖动与之相交的节点。但是,根据您拖动的位置,这不是按钮,而是按钮上的文本。这就是为什么我也包括了孩子们。

总体看起来有点老套,但应该可以解决问题。

【讨论】:

  • 如果 OP 启动“完全按下-拖动-释放”手势,则鼠标事件可以发送到源以外的节点。请参阅this documentation 了解更多信息。
  • 没错,但听起来不像是他要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2016-02-18
  • 2019-06-18
相关资源
最近更新 更多