В моем случае это было вызвано ссылкой неправильного Nib:
BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
Как использовать PauseTransition
A PauseTransition для одной паузы. Следующий образец обновит текст метки после паузы в одну секунду:
label.setText("Started");
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(event ->
label.setText("Finished: 1 second elapsed");
);
pause.play();
Почему PauseTransition не для вас
Но это не что вы хотите сделать. Согласно вашему вопросу, вы хотите обновлять ярлык каждую секунду, а не один раз. Вы можете установить переход на паузу на неопределенное время, но это не поможет вам, потому что вы не можете установить обработчик событий при завершении цикла в JavaFX 8. Если PauseTransition циклически выполняется бесконечно, обработчик завершения для перехода никогда не будет вызван потому что переход никогда не закончится. Итак, вам нужен еще один способ сделать это ...
Вы должны использовать временную шкалу
Как , предложенный Томасом Микулой используйте Timeline вместо PauseTransition.
label.setText("Started");
final IntegerProperty i = new SimpleIntegerProperty(0);
Timeline timeline = new Timeline(
new KeyFrame(
Duration.seconds(1),
event -> {
i.set(i.get() + 1);
label.setText("Elapsed time: " + i.get() + " seconds");
}
)
);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
Альтернативное решение с таймером
Существует альтернативное решение на основе на Timer для следующего вопроса:
Тем не менее, я предпочитаю решение Timeline для решения Timer из этого вопроса. Таймер требует новый поток и дополнительную осторожность в обеспечении обновлений в потоке приложений JavaFX, а решение на основе временной шкалы не требует этого.
Как прокомментировано Adowarth :
вы можете использовать PauseTransition, если вы снова запустите его внутри обработчика финиша
blockquote>int cycle = 0; label.setText("Started"); PauseTransition pause = new PauseTransition(Duration.seconds(1)); pause.setOnFinished(event -> label.setText("Finished cycle " + cycle++); pause.play(); ); pause.play();