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