Я пытаюсь выполнить следующий цикл:JavaFX повторить цикл, когда переход заканчивается
- Update некоторые переменные
- Играть переход на основе/представляющих переменные
- После перехода Done, Go до 1
Это повторяется навсегда. Я сделал это работать со следующим:
//Step 3
transition.setOnFinished(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event){
doTheThing(); //Step 1, updates data
transition.setToValue(data);
transition.play(); // Step 2
}
});
transition.play(); //Triggers first repeat
Конечно, это бесконечный рекурсивный цикл, который не является хорошей идеей. Проблема в том, что я не могу понять, как еще запустить повтор после завершения перехода. Я попытался с помощью цикла:
while (1==1){
doTheThing();
transition.setToValue(data);
transition.play();
}
Но не только это не ждать перехода (следует ожидать и не проблема для меня), она не играет переход на все, и программу не отвечает. Я также пробовал:
transition.setOnFinished(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event){
ready = true;
}
});
while (1==1){
if (ready){
ready = false;
doTheThing();
transition.setToValue();
transition.play();
}
}
Но он действует так же, как решение # 2. Я бы предпочел, чтобы не было ожидания, запрограммированного, но даже если бы я это сделал, я не уверен, как заставить цикл ждать, пока он не повторится, не останавливая переход от игры.
Что я могу сделать вместо этого?
Я не думаю, что ваша первая версия создает бесконечную рекурсию. «Переход» обязательно инкапсулирует некоторые потоки, поэтому метод «play» в основном планирует переход в потоке где-то, а затем немедленно выходит. Поскольку он завершается, вы не сохраняете вызовы методов в стеке. (предпочтительнее решение @ eckig). –
Это означает, что переполнение стека не будет правильным? Я оставил его довольно долгое время и задавался вопросом, почему он не сломался, я просто предположил, что он легкий или что-то еще. Кроме того, если это не вызывает ошибок, почему решение @ eckig предпочтительнее? (Не сомневаюсь, что это так, просто интересно почему) – Spekular
Да, это означало бы отсутствие stackoverflow. Я предпочитаю решение @ eckig, потому что ясно, что происходит. Поскольку в [документации] (http://docs.oracle.com/javase/8/javafx/api/javafx/animation/Animation.html#play--) явно указано, что 'play()' является асинхронным вызовом, я думаю, что ваш оригинальный код в порядке. –