2015-04-17 2 views
2

Я пытаюсь выполнить следующий цикл:JavaFX повторить цикл, когда переход заканчивается

  1. Update некоторые переменные
  2. Играть переход на основе/представляющих переменные
  3. После перехода 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. Я бы предпочел, чтобы не было ожидания, запрограммированного, но даже если бы я это сделал, я не уверен, как заставить цикл ждать, пока он не повторится, не останавливая переход от игры.

Что я могу сделать вместо этого?

+0

Я не думаю, что ваша первая версия создает бесконечную рекурсию. «Переход» обязательно инкапсулирует некоторые потоки, поэтому метод «play» в основном планирует переход в потоке где-то, а затем немедленно выходит. Поскольку он завершается, вы не сохраняете вызовы методов в стеке. (предпочтительнее решение @ eckig). –

+0

Это означает, что переполнение стека не будет правильным? Я оставил его довольно долгое время и задавался вопросом, почему он не сломался, я просто предположил, что он легкий или что-то еще. Кроме того, если это не вызывает ошибок, почему решение @ eckig предпочтительнее? (Не сомневаюсь, что это так, просто интересно почему) – Spekular

+0

Да, это означало бы отсутствие stackoverflow. Я предпочитаю решение @ eckig, потому что ясно, что происходит. Поскольку в [документации] (http://docs.oracle.com/javase/8/javafx/api/javafx/animation/Animation.html#play--) явно указано, что 'play()' является асинхронным вызовом, я думаю, что ваш оригинальный код в порядке. –

ответ

1

Я предлагаю вам использовать TimeLine где вы можете указать cycleCount который вы можете установить на INDEFINITE.

Пример:

Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), ev -> { 
    // TODO do something meaningful here 
})); 
timeline.setCycleCount(Animation.INDEFINITE); 
timeline.play(); 
+1

Спасибо за ответ! Я буду отмечать его, как только я его заработаю (это может занять некоторое время, поскольку я раньше не использовал временные рамки). – Spekular

+1

@Spekular Играйте с ним, 'TimeLine' имеет довольно мощный API .. – eckig

+1

Я буду, еще раз спасибо! – Spekular

Смежные вопросы