Javafx Platform runLater sleep [дубликат]

В моем случае это было вызвано ссылкой неправильного Nib:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
5
задан Rin 30 May 2015 в 07:38
поделиться

2 ответа

Как использовать 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, а решение на основе временной шкалы не требует этого.

8
ответ дан Community 20 August 2018 в 15:47
поделиться
  • 1
    Благодарим вас за введение правильного направления! – Rin 30 May 2015 в 10:01
  • 2
    Чтобы быть полным, вы можете использовать PauseTransition, если вы запустите его снова внутри обработчика финиша, если я прав. – Adowrath 11 February 2017 в 13:57
  • 3
    @Adowrath, да, вы правы. Возможно. – c0der 8 August 2017 в 05:07

Как прокомментировано Adowarth :

вы можете использовать PauseTransition, если вы снова запустите его внутри обработчика финиша

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(); 
1
ответ дан c0der 20 August 2018 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: