Таймеры и javafx

Я пытаюсь написать код, который заставит вещи появляться на экране с заданными, но нерегулярными интервалами, используя javafx. Я пытался использовать таймер ( java.util, а не javax.swing), но оказывается, что вы ничего не можете изменить в приложении, если вы работаете из отдельного потока.(Как таймер) Может кто-нибудь сказать мне, как я мог получить таймер для взаимодействия с приложением, если они оба являются отдельными потоками?

3 ответа

Решение

Если вы касаетесь какого-либо компонента JavaFX, вы должны сделать это из потока платформы (который по сути является потоком отправки событий для JavaFX). Это легко сделать, вызвав Platform.runLater(), Так, например, это совершенно безопасно:

new Thread() {
    public void run() {
        //Do some stuff in another thread
        Platform.runLater(new Runnable() {
            public void run() {
                label.update();
                javafxcomponent.doSomething();
            }
        });
    }
}.start();

Вам не нужно java.util.Timer или же java.util.concurrent.ScheduledExecutorService планировать будущие действия в потоке приложения JavaFX. Вы можете использовать JavaFX Timeline в качестве таймера:

new Timeline(new KeyFrame(
        Duration.millis(2500),
        ae -> doSomething()))
    .play();

Кроме того, вы можете использовать удобный метод из ReactFX:

FxTimer.runLater(
        Duration.ofMillis(2500),
        () -> doSomething());

Обратите внимание, что вам не нужно переносить действие в Platform.runLaterпотому что он уже выполняется в потоке приложения JavaFX.

Ответ berry120 работает с java.util.Timer тоже, так что вы можете сделать

Timer timer = new java.util.Timer();

timer.schedule(new TimerTask() {
    public void run() {
         Platform.runLater(new Runnable() {
            public void run() {
                label.update();
                javafxcomponent.doSomething();
            }
        });
    }
}, delay, period);

Я использовал это, и он отлично работает

Другие вопросы по тегам