当我的应用程序切换表单时,我试图设置一些动画。
我有一个隐藏表单的代码在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事件。
从这里开始的最佳方式是什么?
答案 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
...