JavaFX拖动并单击
我尝试在JavaFX中执行以下操作。我正在使用画布在屏幕上绘制东西,我希望发生以下情况: 当我点击画布表面时(比如快速按下并释放):有些事情发生了 当我在画布表面拖动时(如按住并移动,然后释放):会发生其他事情 但是如果我拖动,我希望它排除单击操作,所以如果我拖动,如果我单击,会发生什么事情,而不应该发生。不幸的是,当我释放鼠标时,似乎释放和单击事件都会启动,即使我拖动。该方法可以与一起使用,两者都来自JavaFX拖动并单击,java,javafx,click,mouseevent,drag,Java,Javafx,Click,Mouseevent,Drag,我尝试在JavaFX中执行以下操作。我正在使用画布在屏幕上绘制东西,我希望发生以下情况: 当我点击画布表面时(比如快速按下并释放):有些事情发生了 当我在画布表面拖动时(如按住并移动,然后释放):会发生其他事情 但是如果我拖动,我希望它排除单击操作,所以如果我拖动,如果我单击,会发生什么事情,而不应该发生。不幸的是,当我释放鼠标时,似乎释放和单击事件都会启动,即使我拖动。该方法可以与一起使用,两者都来自MouseEventAPI 可能您需要为鼠标在按下的鼠标和释放的鼠标之间移动设置一个阈值,以提
MouseEvent
API
可能您需要为鼠标在按下的鼠标和释放的鼠标之间移动设置一个阈值,以提高可用性。该方法可以与一起使用,这两种方法都来自MouseEvent
API
也许您需要为按下的鼠标和释放的鼠标之间的鼠标移动设置一个阈值,以提高可用性。@wcomnisky
非常感谢你的帮助。我最后做的是(我尝试在发布事件处理程序中使用isStillSincePress(),但似乎它仍然将短距离拖动视为单击..尽管我可能做了一些错误的事情)这样做:在鼠标按下处理程序中,我记录按下坐标(可能这个想法类似于isStillSincePressed())方法..可能是通过其名称/描述建议的)pressX=event.getX();pressY=event.getY()
在鼠标释放处理程序中,我这样做:如果((pressX==event.getX())&&(pressY==event.getY())doClickAction();else doDragEndAction()
。似乎在工作。。对于拖动时的操作,我将尝试使用常用的拖动处理程序。@wcomnisky
非常感谢你的帮助。我最后做的是(我尝试在发布事件处理程序中使用isStillSincePress(),但似乎它仍然将短距离拖动视为单击..尽管我可能做了一些错误的事情)这样做:在鼠标按下处理程序中,我记录按下坐标(可能这个想法类似于isStillSincePressed())方法..可能是通过其名称/描述建议的)pressX=event.getX();pressY=event.getY()
在鼠标释放处理程序中,我这样做:如果((pressX==event.getX())&&(pressY==event.getY())doClickAction();else doDragEndAction()
。似乎在工作。。对于拖动时的操作,我将尝试使用常用的拖动处理程序。有点晚了,但万一有人来这里寻求解决方案。我创建了一个简单的类来处理它
用法:
clickNotDragDetectingOn(yourNode)
.withPressedDurationTreshold(150)
.setOnMouseClickedNotDragged((mouseEvent) -> {
// logic here
});
代码:
class MouseClickNotDragDetector{
私有最终节点;
私人消费者一次点击不拖拽;
私有布尔值被拖动;
私人长期压力;
私人长期释放;
私人的长期压力;
专用MouseClickNotDragDetector(节点){
this.node=节点;
node.addEventHandler(按下鼠标)(MouseeEvent)->{
this.timePressed=currentTimeMillis();
});
node.addEventHandler(鼠标拖动,(鼠标事件)->{
this.wasdrable=true;
});
node.addEventHandler(鼠标被释放,(鼠标事件)->{
this.timeReleased=currentTimeMillis();
此.FireEventIfWasClickedNotDrawed(MouseeEvent);
这个.clear();
});
此参数。按DurationReshold=200;
}
静态鼠标ClickKnotDragDetector单击NotDragDetectionOn(节点){
返回新的MouseClickNotDragDetector(节点);
}
鼠标悬垂式拖动检测器,带压缩的持续时间(长持续时间){
this.pressedDurationReshold=持续时间阈值;
归还这个;
}
MouseClickNotDragDetector设置鼠标单击不拖动(消费者单击不拖动){
this.onClickedNotDrawed=onClickedNotDrawed;
归还这个;
}
私人空位清除(){
this.wasdrable=false;
this.timePressed=0;
this.timeReleased=0;
}
私有无效FireEventIfWasClickedNotDrawed(MouseEvent MouseEvent){
如果(this.wasdrable){
调试(“[单击不拖动]拖动!”);
返回;
}
if(this.mousePressedDuration()>this.pressedDurationReshold){
调试(“[CLICK-NOT-DRAG]按得太长,不是单击!”);
返回;
}
调试(“[CLICK-NOT-DRAG]CLICK!”);
this.onClickedNotDrawed.accept(mouseEvent);
}
私人长鼠标pressedDuration(){
返回this.timeReleased-this.timePressed;
}
}
有点晚了,但万一有人来这里寻求解决方案。我创建了一个简单的类来处理它
用法:
clickNotDragDetectingOn(yourNode)
.withPressedDurationTreshold(150)
.setOnMouseClickedNotDragged((mouseEvent) -> {
// logic here
});
代码:
class MouseClickNotDragDetector{
私有最终节点;
私人消费者一次点击不拖拽;
私有布尔值被拖动;
私人长期压力;
私人长期释放;
私人的长期压力;
专用MouseClickNotDragDetector(节点){
this.node=节点;
node.addEventHandler(按下鼠标)(MouseeEvent)->{
this.timePressed=currentTimeMillis();
});
node.addEventHandler(鼠标拖动,(鼠标事件)->{
this.wasdrable=true;
});
node.addEventHandler(鼠标被释放,(鼠标事件)->{
this.timeReleased=currentTimeMillis();
此.FireEventIfWasClickedNotDrawed(MouseeEvent);
这个.clear();
});
此参数。按DurationReshold=200;
}
静态鼠标ClickKnotDragDetector单击NotDragDetectionOn(节点){
返回新的MouseClickNotDragDetector(节点);
}
鼠标悬垂式拖动检测器,带压缩的持续时间(长持续时间){
this.pressedDurationReshold=持续时间阈值;