JavaFX Button 检测事件以及经过的时间
JavaFX Button detecting event as well as time elapsed
我用 Java Swing
实现了这个项目的另一个版本,但是因为它不支持多点触控功能,所以我用 JavaFX
.[=30= 重写了它]
所以我希望程序等待用户单击 Button
对象或超时,比如 5 秒 - 这意味着程序将在屏幕上显示 Button
一个点,直到按下 Button
或 5 秒未按下时才进入下一阶段。
显然,检测点击很简单,因为添加 ActionEvent
即可解决问题。棘手的部分是测量时间。当用 Swing
对象实现时,我会有一个 while 循环并在里面有 Thread.sleep(very_short_time_interval)
来定期检查经过的时间:
lastUpdate = System.currentTimeMillis();
while ((!pressed) && (System.currentTimeMillis() - lastUpdate <= timeout)) {
Thread.sleep(50);
}
上面伪代码中Thread.sleep()
的目的是为了防止while循环执行得太频繁。虽然这似乎不是最佳实践,但这个技巧在与 Swing
对象一起使用时显然有效。但是我在用 JavaFX
Button
对象尝试同样的事情后意识到,它将鼠标指针的形状变成了循环环,表明进程在 Windows 上很忙。更糟糕的是,在这个繁忙阶段,按钮无法识别鼠标输入。我猜 JavaFX
个物体比 Swing
个物体重,因此导致了这个问题。
所以我的问题是,是否有另一种方法,可能是 JavaFX
中的本机函数来使 Button
过期而不需要 while
循环?或者会不会有一些比 Button
更轻的对象以类似的方式(听鼠标点击)工作,可以与原始 while
方法一起工作?
您可以使用PauseTransition
等待n秒。在其 setOnFinished
上,您可以添加要执行的操作。如果按钮已被按下,您可以取消其动作的转换。
final PauseTransition pt = new PauseTransition(Duration.millis(5000));
pt.setOnFinished( ( ActionEvent event ) -> {
doSomething();
});
button.setOnAction( (ActionEvent event) -> {
doSomething();
pt.stop(); // If the button has been pressed, stop the Transition
});
pt.play();
我用 Java Swing
实现了这个项目的另一个版本,但是因为它不支持多点触控功能,所以我用 JavaFX
.[=30= 重写了它]
所以我希望程序等待用户单击 Button
对象或超时,比如 5 秒 - 这意味着程序将在屏幕上显示 Button
一个点,直到按下 Button
或 5 秒未按下时才进入下一阶段。
显然,检测点击很简单,因为添加 ActionEvent
即可解决问题。棘手的部分是测量时间。当用 Swing
对象实现时,我会有一个 while 循环并在里面有 Thread.sleep(very_short_time_interval)
来定期检查经过的时间:
lastUpdate = System.currentTimeMillis();
while ((!pressed) && (System.currentTimeMillis() - lastUpdate <= timeout)) {
Thread.sleep(50);
}
上面伪代码中Thread.sleep()
的目的是为了防止while循环执行得太频繁。虽然这似乎不是最佳实践,但这个技巧在与 Swing
对象一起使用时显然有效。但是我在用 JavaFX
Button
对象尝试同样的事情后意识到,它将鼠标指针的形状变成了循环环,表明进程在 Windows 上很忙。更糟糕的是,在这个繁忙阶段,按钮无法识别鼠标输入。我猜 JavaFX
个物体比 Swing
个物体重,因此导致了这个问题。
所以我的问题是,是否有另一种方法,可能是 JavaFX
中的本机函数来使 Button
过期而不需要 while
循环?或者会不会有一些比 Button
更轻的对象以类似的方式(听鼠标点击)工作,可以与原始 while
方法一起工作?
您可以使用PauseTransition
等待n秒。在其 setOnFinished
上,您可以添加要执行的操作。如果按钮已被按下,您可以取消其动作的转换。
final PauseTransition pt = new PauseTransition(Duration.millis(5000));
pt.setOnFinished( ( ActionEvent event ) -> {
doSomething();
});
button.setOnAction( (ActionEvent event) -> {
doSomething();
pt.stop(); // If the button has been pressed, stop the Transition
});
pt.play();