/ /タイムラインからのJava fxコールバック-java、javafx-2、javafx、timeline

タイムラインからのJava fxコールバック - java、javafx-2、javafx、timeline

アプリケーションがフォームを切り替えるときに再生するアニメーションを設定しようとしています。

アプリケーションで使用されるすべてのフォームによって実装された、Abstractクラスでフォームを非表示にするコードがありました。

final synchronized void hide(){
final Timeline timeline = new Timeline();

timeline.setCycleCount(1);
timeline.setAutoReverse(true);

final KeyValue[] kvArray = new KeyValue[2];
kvArray[0] = new KeyValue(this.getNode().scaleXProperty(), 0);
kvArray[1] = new KeyValue(this.getNode().scaleYProperty(), 0);
final KeyFrame kf = new KeyFrame(Duration.millis(500), kvArray);

timeline.getKeyFrames().add(kf);
timeline.play();
}

次に、Controllerクラスがこのメソッドを呼び出し、非表示アニメーションを再生し、次のフォームを表示します。すべてのフォームは境界ペインの中心として表示されるため、フォームを切り替えるには、使用されている境界ペインの中心でノードを切り替える必要があります。

問題はタイムラインが非同期で再生されるため、アニメーションが再生される前に非表示関数が戻り、新しいフォームがアニメーションなしで表示されることです。

待機と通知、およびonFinishedイベントを使用しようとしましたが、失敗しました。

ここから先に進む最良の方法は何ですか?

回答:

回答№1は2

変換しようとしましたか Timeline ローカル変数からフォームの遷移を管理し、そこでインスタンス化するクラスのフィールドまで。それからしましょう hide() 追加するだけ KeyFrame よりグローバルに Timeline ...


回答№2の場合は3

として hide() 実行されるFXMLによって呼び出されます FX Event Thread このスレッドで停止して待つことはできません(これによりアニメーションも停止します)。

この機能の最も簡単な解決策は、タイムラインによって呼び出される機能を提供することです。例えば。:

final void hide(EventHandler<ActionEvent> nextAction){
final Timeline timeline = new Timeline();

timeline.setCycleCount(1);
timeline.setAutoReverse(true);

final KeyValue[] kvArray = new KeyValue[2];
kvArray[0] = new KeyValue(this.getNode().scaleXProperty(), 0);
kvArray[1] = new KeyValue(this.getNode().scaleYProperty(), 0);
final KeyFrame kf = new KeyFrame(Duration.millis(500), kvArray);

timeline.getKeyFrames().add(kf);
// here we call function from parameter
timeline.setOnFinished(nextAction);
timeline.play();
}