3

我有这个工作代码:

Duration duration = Duration.millis(1000 / 30.0);
videoTick = new Timeline(new KeyFrame(duration, new EventHandler<ActionEvent>() {
    public void handle(ActionEvent actionEvent) {
            System.out.println("tick");
        }
    }));
videoTick.setCycleCount(Animation.INDEFINITE);
videoTick.playFromStart();

完美。但是一旦我稍微改变了持续时间:

Duration duration = Duration.millis(1000 / 30.1);

它不再起作用了!我是疯了还是 JavaFx 完全崩溃了?如何解决它?

编辑:我知道这个错误看起来没有任何意义,但它就发生在我面前。我提供了重现它的最少代码。

import javafx.animation.*;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.util.Duration;
import javafx.stage.Stage;

public class Ticker extends Application {
    private Timeline videoTick;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(final Stage primaryStage) {
        Duration duration = Duration.millis(1000 / 30.0);
        videoTick = new Timeline(new KeyFrame(duration, new EventHandler<ActionEvent>() {
            public void handle(ActionEvent actionEvent) {
                System.out.println("Tick");
            }
        }));
        videoTick.setCycleCount(Animation.INDEFINITE);
        videoTick.playFromStart();
    }
}

然后将 更改30.030.1

编辑 2 好的,这是一个(部分)解决方法:在不Timeline#play()工作时工作。Timeline#playFromStart()编辑4:对不起,这不起作用。显然我太累了。)

但问题并没有解决:如果你真的需要playFromStart怎么办?更重要的是,为什么它不起作用1000/30.1

编辑 3

我在 OSX 10.8 + Java/JavaFx 1.7.0_17 和 Java/JavaFx 1.7.0_21 上复制了它。

4

1 回答 1

1

Java 7 错误

这是 Java 7 中 JavaFX 的一个错误。我在 JavaFX 问题跟踪器中创建了RT-31027来跟踪这个问题。

从命令行编译和运行时,我能够使用 Java 1.7.0_21、OSX 10.8 重现此(无刻度输出)。

很抱歉之前误报它在 Java 1.7.0_21 中工作(我在 IDE 中切换 java 版本时出现设置错误)。

在 Java 8 中已修复

它在 Java8b92 中确实有效(输出刻度),因此该错误似乎已在以后的 JavaFX 版本中得到修复。 Java 8 早期访问版本可用。因此,作为一种解决方法,您可以使用 Java 8。

替代实施

对于此类经常发生的动画,您还可以考虑使用AnimationTimer代替。

更新

RT-31027是我为跟踪此问题而创建的问题跟踪器记录,已在 8.0 中按固定方式关闭,并附有评论“只有关键修复程序向后移植到 2.2,因此将其按固定方式关闭”。

于 2013-06-08T23:02:02.640 回答