来自时间轴的Java fx回调

时间:2013-11-18 22:37:26

标签: 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类调用此方法,播放隐藏动画,并显示下一个表单。所有表单都显示在边框窗格的中心,因此要切换表单,我必须在使用的边框窗格的中心切换节点。

概率是时间轴播放异步,因此隐藏函数在播放动画之前返回,新的表单显示时没有动画。

我尝试过使用wait和notify以及onFinished事件。

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

2 个答案:

答案 0 :(得分:3)

由于hide()由FXML调用,它将在FX Event Thread上运行,你无法停止并等待这个线程(因为这也将停止你的动画)。

此功能的最简单解决方案是提供将由时间轴调用的功能。 E.g:

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();
}

答案 1 :(得分:2)

您是否尝试将Timeline从局部变量转换为管理表单转换的类的字段,并在那里实例化它。然后,让hide()仅将KeyFrame附加到更全球的Timeline ...