【问题标题】: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() 返回当前拖动与之相交的节点。但是,根据您拖动的位置,这不是按钮,而是按钮上的文本。这就是为什么我也包括了孩子们。
总体看起来有点老套,但应该可以解决问题。