Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从窗口拖动时请求焦点_Java_Javafx_Eventhandler - Fatal编程技术网

Java 从窗口拖动时请求焦点

Java 从窗口拖动时请求焦点,java,javafx,eventhandler,Java,Javafx,Eventhandler,我是JavaFX新手,我需要的是在用户从我的应用程序外部(比如他的操作系统)拖动某个文件时检测鼠标位置。我为dragEntered和dragExited添加了一个侦听器,如下所示: EventHandler<MouseEvent> mouseMoved = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { logger.sev

我是JavaFX新手,我需要的是在用户从我的应用程序外部(比如他的操作系统)拖动某个文件时检测鼠标位置。我为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);
    }
});
EventHandler mouseMoved=neweventhandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
logger.severy(event.getScreenX()+“:”+event.getScreenY());
}
};
scrollPane.setOnDragEntered(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
scrollPane.getScene().getWindow().requestFocus();
scrollPane.requestFocus();
event.consume();
IsDraging=true;
logger.severy(event.getScreenX()+“:”+event.getScreenY());
scrollPane.addEventHandler(MouseEvent.MOUSE_MOVED,mouseMoved);
}
});
scrollPane.setOnDragExited(新的EventHandler(){
@凌驾
公共无效句柄(事件){
IsDraging=错误;
event.consume();
scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED,mouseMoved);
}
});
scrollPane.setOnDragDrop(新的EventHandler(){
@凌驾
公共无效句柄(事件){
IsDraging=错误;
event.consume();
scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED,mouseMoved);
}
});
它成功地检测到用户进入了我的视图,拖动了一些东西,但是由于用户在我的应用程序外单击,我的节点没有焦点,我也不能请求焦点,因为焦点在操作系统上-因此我不能在我的滚动窗格节点上添加MouseEventHandler来检测鼠标移动。我需要它来实现智能滚动,所以当用户在我的滚动窗格上拖动时,他可以移动节点底部的鼠标,它将平滑地向下滚动


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

使用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");

        }
    });
scrollPane.setOnDragExited(新的EventHandler(){
@凌驾
公共无效句柄(事件){
event.consume();
event.getScreenX();//获取x位置
event.getScreenY();//获取y位置
mouseonstemplatebasker=false;
logger.severy(“退出拖动某物”);
}
});

在@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();
    }
});
scrollPane.setOnDragEntered(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
scrollPane.getScene().getWindow().requestFocus();
scrollPane.requestFocus();
event.consume();
IsDraging=true;
}
});
scrollPane.setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
double windowHeight=scrollPane.getHeight();
双顶杆=(20*窗高)/100;
双底条=窗高-顶条;
event.acceptTransferModes(TransferMode.LINK);
if(event.getY()>0&&event.getY()0)
scrollPane.setVvalue(scrollPane.getVvalue()-0.001);
else if(event.getY()bottomBar&&scrollPane.getVvalue()<1)
scrollPane.setVvalue(scrollPane.getVvalue()+0.001);
}
});
scrollPane.setOnDragExited(新的EventHandler(){
@凌驾
公共无效句柄(事件){
IsDraging=错误;
event.consume();
}
});
scrollPane.setOnDragDrop(新的EventHandler(){
@凌驾
公共无效句柄(事件){
IsDraging=错误;
event.consume();
}
});
这提供了一个智能滚动,同时拖动,这意味着如果你从操作系统(例如)将一个文件拖动到滚动窗格上的应用程序中,如果你在上面提到的滚动窗格的底部20%移动鼠标,它将缓慢向下滚动,如果你在滚动窗格的顶部20%移动鼠标,它将向上滚动


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

谢谢您的回答。事实上,现在我可以得到鼠标的X/Y位置,但只有当他离开我的视线时。当用户在我的滚动窗格上移动鼠标时,我需要一些事件处理程序。未测试,但在调用
scrollPane.getScene().getWindow().requestFocus()
之前,先请求聚焦在窗口上是否有帮助,即执行
scrollPane.getWindow().requestFocus()
?谢谢您的回答。这确实改变了我的应用程序(我在任务栏上看到)的焦点,但仍然无法使用鼠标移动的eventhandler。