Задача
В моем приложении я использую бесконечный RotateTransition.
Button btnRotating = new Button("I'm rotating");
final RotateTransition rt = new RotateTransition(Duration.millis(2000), btnRotating);
rt.setFromAngle(0);
rt.setToAngle(180);
rt.setInterpolator(Interpolator.LINEAR);
rt.setCycleCount(Timeline.INDEFINITE);
Когда я прекращаю этот переход, я хочу вернуть повернутый узел в исходное положение.
rt.stop();
rt.getNode().setRotate(0);
Проблема в том, что rt.stop () является асинхронным, поэтому переход мог не остановиться, когда я сбросил вращение узла. Поэтому иногда переход перезаписывает мой сброс вращения.
Неудачные решения
rt.onFinishedProperty().addListener((observable, oldValue, newValue) -> {
rt.getNode().setRotate(0);
});
Выполнение rt.getNode (). SetRotate (0), когда onFinishedProperty изменений перехода не работает, так как остановка перехода вручную не вызывает onFinishedProperty.
rt.statusProperty().addListener((observable, oldValue, newValue) -> {
if(newValue == Status.STOPPED){
rt.getNode().setRotate(0);
}
});
Прослушивание статуса Свойство перехода имеет ту же проблему, что и сброс вращения вручную. Для свойства status устанавливается значение STOPPED, как только я вызываю rt.stop (), но оно не ожидает завершения перехода.
Вопрос
Так как я могу безопасно сбросить свой узел в исходное положение? Как я могу определить, что переход действительно завершился после сброса узла?
Когда я выполняю rt.getNode (). SetRotate (0) в потоке приложения JavaFX, кажется, что он работает надежно, так как мой поворот сброса ставится в очередь после последнего вращения перехода. Это лучшее решение? Должны ли rt.stop () и rt.start также выполняться в потоке FX?
Еще одна вещь, которую я заметил, это то, что в JavaDoc функции rt.stop () написано: «Останавливает анимацию и сбрасывает головку воспроизведения в исходное положение». Таким образом, игровая головка сбрасывается, но этот сброс не передается на узел, так как переход остановлен. Есть ли способ использовать это?