アプリケーションがフォームを切り替えるときに再生するアニメーションを設定しようとしています。
アプリケーションで使用されるすべてのフォームによって実装された、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();
}