Как реализовать обновление Label в JavaFX с использованием FXML файла

Я переделываю свои программы на Swing в программы JavaFX. Одна из программ это часы. Суть заключается в том что нужно каждую секунду обновлять Label. Я задавал подробный вопрос только связаный с библиотекой Swing, а не JavaFX. Вот этот вопрос. Я поискал в Google решение моей проблемы и наткнулся на метод Platform.runLater() и переписал код под него. Она заработала, но я не могу использовать FXML файл. Как мне это реализовать? Также вот код для изменения Label:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("'Today' dd.MM.yyyy, HH:mm:ss");
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    executor.scheduleWithFixedDelay(() -> {
        LocalDateTime now = LocalDateTime.now();
        String nowFormatted = dateTimeFormatter.format(now);
        Platform.runLater(() -> timer.setText(nowFormatted));
    }, 0, 1, TimeUnit.SECONDS);

Ответы (1 шт):

Автор решения: Kostya

Похоже что вы делаете что то не так.

1)Нужно связать fxml файл с контроллером. Для этого над классом контроллера нужна аннотация:

@ViewController(value = "/fxml/timer.fxml", title = "Таймер")

2)В fxml файле указать id для элемента.

<Label fx:id="timeLabel" />

3)В контроллере определить этот элемент

@FXML
private Label timeLabel;

Название id и имени переменной должны совпадать, тогда javafx сделает инжект.

4)Можно использовать @PostConstruct, метод с этой аннотацией выполнится после создания контроллера.

@PostConstruct
public void init() {
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("'Today' dd.MM.yyyy, HH:mm:ss");
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    executor.scheduleWithFixedDelay(() -> {
        LocalDateTime now = LocalDateTime.now();
        String nowFormatted = dateTimeFormatter.format(now);
        Platform.runLater(() -> timer.setText(nowFormatted));
    }, 0, 1, TimeUnit.SECONDS);
}
→ Ссылка