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 に答える