来自时间轴的JavaFX回调

来自时间轴的JavaFX回调,java,javafx-2,javafx,timeline,Java,Javafx 2,Javafx,Timeline,我正在尝试设置一些动画,以便在我的应用程序切换表单时播放 我有在抽象类中隐藏表单的代码,由应用程序中使用的所有表单实现 final synchronized void hide(){ final Timeline timeline = new Timeline(); timeline.setCycleCount(1); timeline.setAutoReverse(true); final KeyValue[] kvArray = new KeyValue[

我正在尝试设置一些动画,以便在我的应用程序切换表单时播放

我有在抽象类中隐藏表单的代码,由应用程序中使用的所有表单实现

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();
}
然后控制器类调用此方法,播放隐藏动画,并显示下一个窗体。所有表单都显示在边框窗格的中心,因此要切换表单,我必须切换已使用边框窗格中心的节点

问题是时间轴播放异步,因此在播放动画之前,hide函数返回,并且新表单显示时不显示动画

我尝试使用wait和notify以及onFinished事件,但未成功


从这里开始的最佳方式是什么?

您是否尝试将
时间线
从局部变量转换为类的字段,该字段管理表单的转换,并在那里实例化它。然后让
hide()
只将
关键帧
附加到更全局的
时间线

因为FXML调用了
hide()
,它将在
FX事件线程
上运行,您不能停止并等待该线程(因为这也将停止动画)

此功能最简单的解决方案是提供将由时间线调用的函数。例如:

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();
}
final void hide(EventHandler nextAction){
最终时间线=新时间线();
时间线。setCycleCount(1);
timeline.setAutoReverse(真);
最终KeyValue[]kvArray=新的KeyValue[2];
kvArray[0]=新的键值(this.getNode().ScaleProperty(),0);
kvArray[1]=新的键值(this.getNode().ScaleProperty(),0);
最终关键帧kf=新关键帧(持续时间.millis(500),kVA数组);
timeline.getKeyFrames().add(kf);
//这里我们从参数调用函数
timeline.setOnFinished(nextAction);
timeline.play();
}

谢谢mate,它工作得很好,这实际上是我的第一个选择,但我不知道如何在内部类中调用对象函数,正如EventHandler中定义的那样,我现在意识到需要将它们设置为final。谢谢你的帮助我用了Jens Piegsa小费,谢谢你的帮助!