Таймеры и 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);
Я использовал это, и он отлично работает