【发布时间】:2016-12-24 14:43:48
【问题描述】:
我的 javaFX 项目中有一辆汽车,当按下 SPACE 时,汽车(节点)的位置应该改变(汽车应该平稳跳跃)。所以我使用了一个事件处理程序,它调用一个名为 :moveUp()
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
switch (event.getCode())
{
case SPACE:
moveUp();
break;
}
}
});
这会创建一个新的线程,其中汽车的速度会以 75 毫秒的间隔改变 10 次。
private void moveUp() {
new Thread(new Runnable() {
@Override
public void run() {
carSpeed = 10;
for(;carSpeed>=0;carSpeed--)
{
try {
Thread.currentThread().sleep(75);
} catch (InterruptedException e) {
e.printStackTrace();
}
carPosition_X+=carSpeed;
carPosition_Y-=carSpeed;
car.relocate(carPosition_X,carPosition_Y);
}
for(carSpeed=0;carSpeed<=10;carSpeed++)
{
try {
Thread.currentThread().sleep(75);
} catch (InterruptedException e) {
e.printStackTrace();
}
carPosition_X+=carSpeed;
carPosition_Y+=carSpeed;
car.relocate(carPosition_X,carPosition_Y);
}
}
}).start();
}
如果我不使用不同的线程,GUI 线程将被冻结,如果我不使用 Thread.sleep(),汽车会突然跳跃(不顺畅)。这段代码运行良好。但我了解到thread.start() 不能保证立即执行线程。如何保证立即执行?
【问题讨论】:
-
据我所知,您不能保证立即执行,因为这是物理限制。但是:删除 Thread.sleep() 并使用每个循环执行中的增量时间来计算汽车应该移动的量。
-
看看
javafx.animationpackage;Timeline可能是最合适的类...