从 windows 拖动时请求焦点

Request focus while dragging from windows

我是 JavaFX 的新手,我需要的是在用户从我的应用程序外部拖动某些文件时检测鼠标位置,例如他的 OS。我为 dragEntered 和 dragExited 添加了一个监听器,如下所示:

EventHandler<MouseEvent> mouseMoved = new EventHandler<MouseEvent>() {

    @Override
    public void handle(MouseEvent event) {
        logger.severe(event.getScreenX() + " : " + event.getScreenY());
    }
};

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() {

    @Override
    public void handle(DragEvent event) {
        scrollPane.getScene().getWindow().requestFocus();
        scrollPane.requestFocus();
        event.consume();
        isDragging = true;
        logger.severe(event.getScreenX() + " : " + event.getScreenY());
        scrollPane.addEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved);
    }
});

scrollPane.setOnDragExited(new EventHandler<Event>() {
    @Override
    public void handle(Event event) {
        isDragging = false;
        event.consume();
        scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved);
    }
});

scrollPane.setOnDragDropped(new EventHandler<Event>() {
    @Override
    public void handle(Event event) {
        isDragging = false;
        event.consume();
        scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved);
    }
});

它成功检测到用户进入了我的视图,拖动了一些东西,但是由于用户在我的应用程序外部单击,我的节点没有焦点,我也不能 requestFocus,因为焦点在 OS - 所以我无法在我的 scrollPane 节点上添加 MouseEventHandler 来检测鼠标移动。我需要这个来实现智能滚动,所以当用户在我的ScrollPane上拖动时,他可以将鼠标移动到节点的底部,它会平滑地向下滚动。

有人可以帮我解决这个问题吗?

使用DragEvent代替Event,例如:

scrollPane.setOnDragExited(new EventHandler<Event>() {
        @Override
        public void handle(Event event) {
            event.consume();
            event.getScreenX(); // To get x position
            event.getScreenY(); // To get y position
            mouseOnTemplateBasker = false;
            logger.severe("Exited dragging something");

        }
    });

在@James_D 的帮助下,我设法使用 setOnDragOver 获得鼠标在任何移动时的位置。如果有人有同样的问题,这是我的代码现在的样子:

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() {

    @Override
    public void handle(DragEvent event) {
    scrollPane.getScene().getWindow().requestFocus();
    scrollPane.requestFocus();
    event.consume();
    isDragging = true;

    }
});

scrollPane.setOnDragOver(new EventHandler<DragEvent>() {

    @Override
    public void handle(DragEvent event) {
    double windowHeight = scrollPane.getHeight();
    double topBar = (20*windowHeight)/100;
    double bottomBar = windowHeight - topBar;
    event.acceptTransferModes(TransferMode.LINK);
    if(event.getY() > 0 && event.getY() < topBar && scrollPane.getVvalue() > 0)
    scrollPane.setVvalue(scrollPane.getVvalue()-0.001);
    else if(event.getY() < windowHeight && event.getY() > bottomBar && scrollPane.getVvalue() < 1)
    scrollPane.setVvalue(scrollPane.getVvalue()+0.001);
    }

});

scrollPane.setOnDragExited(new EventHandler<Event>() {
    @Override
    public void handle(Event event) {
    isDragging = false;
    event.consume();
    }
});

scrollPane.setOnDragDropped(new EventHandler<Event>() {
    @Override
    public void handle(Event event) {
    isDragging = false;
    event.consume();
    }
});

这提供了一种智能滚动,同时拖动,这意味着如果您将文件从 OS(例如)拖动到滚动窗格上的应用程序中,如果您将鼠标移动到底部 20%在提到的 scrollPane 中,它会慢慢向下滚动,如果您将鼠标移动到 scrollPane 的顶部 20% 上,它也会慢慢滚动 - 它会向上滚动。

感谢您的帮助,如果您有任何其他意见,我很乐意阅读。