在特定条件下每 10 毫秒触发一个事件 Javafx
Firing an event every 10 miliseconds under a certain condition Javafx
您好,我正在尝试在检测到拖动但鼠标尚未释放的情况下每 10 毫秒触发一个事件。下面是我希望触发的代码。
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;
});
不幸的是,之前我曾尝试在活动中使用预定的执行程序服务,但这并没有正常工作。
您可以使用一个 AnimationTimer,它(尝试)以每 second.So 60 帧的速度运行,每次 10 秒后您执行代码(您必须启动 AnimationTimer
时间):
代码:
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,因为 final restriction 和 Lambdas)
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());
}
});
您好,我正在尝试在检测到拖动但鼠标尚未释放的情况下每 10 毫秒触发一个事件。下面是我希望触发的代码。
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;
});
不幸的是,之前我曾尝试在活动中使用预定的执行程序服务,但这并没有正常工作。
您可以使用一个 AnimationTimer,它(尝试)以每 second.So 60 帧的速度运行,每次 10 秒后您执行代码(您必须启动 AnimationTimer
时间):
代码:
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,因为 final restriction 和 Lambdas)
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());
}
});