在特定条件下每10毫秒触发一次事件Javafx
您好,我正在尝试在检测到拖动但未释放鼠标的情况下,每10毫秒触发一次事件。下面是我希望触发的代码在特定条件下每10毫秒触发一次事件Javafx,java,events,javafx,mouseevent,Java,Events,Javafx,Mouseevent,您好,我正在尝试在检测到拖动但未释放鼠标的情况下,每10毫秒触发一次事件。下面是我希望触发的代码 mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { endX = e.getX(); endY = e.getY(); Bounds viewBounds = mapScroll.getViewportBounds(); double startEndX = star
mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> {
endX = e.getX();
endY = e.getY();
Bounds viewBounds = mapScroll.getViewportBounds();
double startEndX = startX - endX;
double startEndY = startY - endY;
Bounds contentBounds = mapScroll.getContent().getLayoutBounds();
double hChange = startEndX / (contentBounds.getWidth() - viewBounds.getWidth());
double vChange = startEndY / (contentBounds.getHeight() - viewBounds.getHeight());
mapScroll.setHvalue(mapScroll.getHvalue() + hChange);
mapScroll.setVvalue(mapScroll.getVvalue() + vChange);
startX = endX;
startY = endY;
});
不幸的是,在我尝试在事件中使用计划执行器服务之前,这没有正常工作。您可以使用(尝试)以每秒60帧的速度运行的。因此,每过10秒,您就执行代码(每次都必须启动动画计时器
):
代码:
public void startTimer(){
AnimationTimer timer = new AnimationTimer() {
int seconds;
@Override
public void handle(long now) {
//every time 10 seconds have passed
//note that 1 second=1000 milliseconds=1.000.000 nanoseconds
//now->variable which represents nano seconds
if(now%10000000 == 0){
endX = e.getX();
endY = e.getY();
Bounds viewBounds = mapScroll.getViewportBounds();
double startEndX = startX - endX;
double startEndY = startY - endY;
Bounds contentBounds = mapScroll.getContent().getLayoutBounds();
double hChange = startEndX / (contentBounds.getWidth() - viewBounds.getWidth());
double vChange = startEndY / (contentBounds.getHeight() - viewBounds.getHeight());
mapScroll.setHvalue(mapScroll.getHvalue() + hChange);
mapScroll.setVvalue(mapScroll.getVvalue() + vChange);
startX = endX;
startY = endY;
}
}
}
}
timer.start();
}
只需添加一个检查,检查自上次执行以来是否已过10毫秒。(我使用了LongProperty,因为与Lambdas的关系)
你应该提供一些解释(看看Meta)。我不确定这个问题是否有意义。如果鼠标在该脉冲期间被拖动并改变位置,则您已经拥有的事件过滤器将在每个脉冲中执行一次,也就是说,它将以系统能够检测到鼠标位置变化并作出响应的速度执行。每10ms(100Hz)比JavaFX的目标脉冲率(60Hz)稍快一点,因此并不是每次对滚动窗格所做的更改都会被呈现(有时在同一脉冲中会发生两次更改)。你想做什么?@James_D我想他想做的是,当你在windows资源管理器中拖动一个文件或文件夹时,它有许多垂直或水平的文件。滚动条根据鼠标的位置垂直或水平移动(如果鼠标垂直或水平到达窗口的末端)所以你可以看到和其他文件。理论上它应该更新得很快,但实际上它移动得很明显,这不是我想要的。我知道这不是我的电脑,因为这个程序对我使用的处理器或RAM的百分比几乎没有影响。我怀疑这是我的代码的问题,因为
setpannable(true)也存在同样的问题代码>所以是的…复杂的东西使它不能很好地工作。
final LongProperty timeOfLastExecute = new SimpleLongProperty(System.currentTimeMillis());
mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> {
if(System.currentTimeMillis() - timeOfLastExecute.get() > 10) {
endX = e.getX();
endY = e.getY();
Bounds viewBounds = mapScroll.getViewportBounds();
double startEndX = startX - endX;
double startEndY = startY - endY;
Bounds contentBounds = mapScroll.getContent().getLayoutBounds();
double hChange = startEndX / (contentBounds.getWidth() - viewBounds.getWidth());
double vChange = startEndY / (contentBounds.getHeight() - viewBounds.getHeight());
mapScroll.setHvalue(mapScroll.getHvalue() + hChange);
mapScroll.setVvalue(mapScroll.getVvalue() + vChange);
startX = endX;
startY = endY;
timeOfLastExecute.set(System.currentTimeMillis());
}
});