JavaFX中如何检测鼠标按下后移入对象,现有代码无响应怎么解决
问题原因
你当前使用的setOnDragDetected是JavaFX原生拖放体系的起始触发事件,仅当你在圆形节点本身上面按下鼠标并开始拖动时才会触发,无法匹配「先在空白处按住左键、再拖动划过圆形」的触发场景。
修复方案
你需要开启JavaFX的全量拖动跟踪,同时监听拖动状态下鼠标进入节点的事件,修改后代码如下:
修改后的DragTester类
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.stage.Stage; public class DragTester extends Application { public static Group group = new Group(); public static Scene scene = new Scene(group, 500, 500); @Override public void start(Stage stage) { // 开启全量拖动跟踪,让拖动路径上的所有节点都能收到拖动事件 scene.setOnMousePressed(MouseEvent::startFullDrag); for(int i = 0; i < 3; i++){ DragBox DB = new DragBox(i * 150 + 100); } stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }
修改后的DragBox类
import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.input.MouseDragEvent; public class DragBox { private Circle c = new Circle(0, 0, 25); public DragBox(double x){ DragTester.group.getChildren().add(c); c.setLayoutX(x); c.setLayoutY(250); // 监听拖动状态下鼠标进入节点的事件 c.setOnMouseDragEntered((MouseDragEvent e) -> { c.setFill(Color.rgb((int)(Math.random() * 255), (int)(Math.random() * 255), (int)(Math.random() * 255))); }); } }
修改说明
- 新增的
scene.setOnMousePressed(MouseEvent::startFullDrag):默认JavaFX的拖动事件仅会发给拖放起始节点,调用这个方法后,拖动过程中鼠标经过的所有节点都会收到对应的鼠标拖动事件,刚好匹配你按住左键划过圆形的触发逻辑。 - 替换事件类型为
MOUSE_DRAG_ENTERED:这个事件会在拖动状态下鼠标进入节点边界时触发,完全符合你要的划过就触发的需求。 - 修复了原代码中随机颜色第三个参数没有乘255的问题,避免生成的颜色永远只有红、绿通道有值。
内容的提问来源于stack exchange,提问作者Dragger123
相关产品推荐
相关产品推荐

