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();